2011-12-04 72 views
6

我使用的是open-ssl源碼,在https://github.com/eighthave/openssl-android 構建了一個可以在android項目中使用的庫。爲平臺2.1構建Android-openssl庫

按在README.txt中給出的指示,我能夠編譯它的Android平臺版本2.2(級-8)

但我的應用程序需要它是2.1(級-7)兼容。

我試圖在與default.properties文件(https://github.com/eighthave/openssl-android/blob/master/default.properties

1)設定的目標=機器人-7

2)設定的目標選項=機器人-5-

但是,當我編譯它使用命令ndk-build,它給出以下錯誤

Compile thumb : crypto <= dsa_vrf.c 
    Compile thumb : crypto <= dso_dl.c 
    Compile thumb : crypto <= dso_dlfcn.c 
    /Crypto/openssl-android/crypto/dso/dso_dlfcn.c: In function 'dlfcn_pathbyaddr': 
    /Crypto/openssl-android/crypto/dso/dso_dlfcn.c:445: error: 'Dl_info' undeclared (first use in this function) 
    /Crypto/openssl-android/crypto/dso/dso_dlfcn.c:445: error: (Each undeclared identifier is reported only once 
    /Crypto/openssl-android/crypto/dso/dso_dlfcn.c:445: error: for each function it appears in.) 
    /Crypto/openssl-android/crypto/dso/dso_dlfcn.c:445: error: expected ';' before 'dli' 
    /Crypto/openssl-android/crypto/dso/dso_dlfcn.c:455: error: 'dli' undeclared (first use in this function) 
    make: *** [obj/local/armeabi/objs/crypto/dso/dso_dlfcn.o] Error 1 

根據錯誤消息 - Dl_info未定義。但如果我們轉到文件dso_dlfcn.c,則已經提供了該結構的定義。 (https://github.com/eighthave/openssl-android/blob/master/crypto/dso/dso_dlfcn.c

而這段代碼在默認屬性文件中編譯爲target = android-8,但不適用於android-7或android-5。

請求你幫我解決這個錯誤。並讓我知道爲了將其編譯爲android 2.1平臺而需要做的所有更改。

在此先感謝。

+0

你也有[OpenSSL和安卓(https://開頭wiki.openssl.org/index.php/Android)。 – jww

回答

6

嘗試包括下面的一段代碼到dso_dlfcn.c:

typedef struct { 
const char *dli_fname; /* Pathname of shared object that 
          contains address */ 
void  *dli_fbase; /* Address at which shared object 
          is loaded */ 
const char *dli_sname; /* Name of nearest symbol with address 
          lower than addr */ 
void  *dli_saddr; /* Exact address of symbol named 
          in dli_sname */ 
} Dl_info; 
int dladdr(const void *addr, Dl_info *info) { return 0; } 

前:

#ifdef __linux 
# ifndef _GNU_SOURCE 
# define _GNU_SOURCE /* make sure dladdr is declared */ 
# endif 
#endif 

後,在我的情況下,庫建成。

+0

謝謝,圖書館建立成功。 – Sushil

+0

不客氣!祝你好運! – Yury

+0

這個問題依然存在.. !!但@Yuri建議的解決方法救了我..謝謝:) –

0

嘗試使用最新的NDK版本進行安裝並適當更新Application.mk文件。

LOCAL_PATH := $(call my-dir) 
APP_PLATFORM := android-19 
NDK_TOOLCHAIN_VERSION := clang 
APP_ABI := armeabi-v7a 
APP_STL := gnustl_static 
APP_CPPFLAGS += -frtti 
APP_CPPFLAGS += -fexceptions 
APP_CPPFLAGS += -DANDROID 
APP_PROJECT_PATH := $(shell pwd) 
APP_BUILD_SCRIPT := $(LOCAL_PATH)/../Android.mk 

上述2個問題將得到解決。

0

我有@尤里的解決方案的一個問題,並不得不改進它。我的APP_ABIApplication.mk中設置爲all。在我的情況下,這意味着armeabiarmeabi-v7a之間我也建設x86mips。我也有android-9 target安裝在android sdk中用於其他項目。 x86mips由ndk支持,從android-9開始。正如文檔中所寫,當ndk-build將開始構建這些目標時,它將自動切換到android-9目標。什麼? - 是的,它將無法編譯:-)。這裏是我的解決方案:

  1. 在crypto/Android.mk找到行local_c_flags := -DNO_WINDOWS_BRAINDEATH。行後寫這個http://pastebin.com/7euUVD7A
  2. 尤里的代碼必須被插入到if definedhttp://pastebin.com/V58gTSBU
  3. 順便說一句,我插尤里的塊#include <openssl/dso.h>之後而不是之前#ifdef __linux