2013-03-21 32 views
2

我正在使用NDK爲Android編寫原生lib(mylib.so)。 Mylib.so取決於libssl.so。在原生Android應用中使用libssl.so

Android NDK doc告訴我,我不應該在system/lib中使用libssl.so,因爲它不是穩定API的一部分。相反,我應該自己交叉編譯libssl並將其添加到NDK。

但是我發現mylib.so會自動鏈接到system/lib/libssl.so,因爲dalvik vm(正在加載mylib.so)已經取決於libssl.so。

$ readelf -d /system/bin/dalvikvm | grep Shared 
0x00000001 (NEEDED)      Shared library: [libdvm.so] 
0x00000001 (NEEDED)      Shared library: [libssl.so] 
0x00000001 (NEEDED)      Shared library: [libz.so] 
0x00000001 (NEEDED)      Shared library: [libc.so] 
0x00000001 (NEEDED)      Shared library: [libstdc++.s 
0x00000001 (NEEDED)      Shared library: [libm.so] 

那麼,處理這個問題的正確方法是什麼?無論如何使用system/lib/libssl.so?

感謝

+0

您可以鏈接到的libssl'mylib.so'作爲靜態庫('libssl.a')? – fadden 2013-03-21 21:33:56

+0

我可能會靜態鏈接,但我不確定這是否是一種通用解決方案,例如在同一個應用程序中的兩個庫都需要libssl的情況下。要指定我的問題:是否安全地動態鏈接到system/lib/libssl.so,知道它不是一個穩定的API?有其他人嘗試過嗎?使用system/lib/libssl.so時是否存在缺陷或功能差距?謝謝 – user2194434 2013-04-05 13:41:29

+2

與非公共圖書館聯繫並不安全。系統更新時它們可能會更改,可能會破壞您的應用程序。另一個想法是將libssl.so重命名爲其他內容(libssl-mine.so)並鏈接到該目錄;這將阻止動態鏈接器「聰明」並找到系統的實現。 – fadden 2013-04-05 15:58:15

回答

0

這聽起來像這個問題可能是在你的Android.mk文件。假設你已經成功通過交叉編譯你想成爲一個.so文件的libssl版本,你會希望做一個新的模塊在你的Android.mk文件看起來像下面這樣:

include $(CLEAR_VARS) 
LOCAL_MODULE := libssl-prebuilt 
LOCAL_SRC_FILES := libssl.so 
LOCAL_EXPORT_C_INCLUDES := /path/to/the/include/files/for/libssl.so 
include $(PREBUILT_SHARED_LIBRARY) 

的上面的模塊將您本地的預建版本的libssl.so添加到您的本地項目中。如果在編譯mylib.so時想要鏈接本地版本的libssl.so,則必須將以下條目添加到您的mylib模塊中。

LOCAL_SHARED_LIBRARIES := libssl-prebuilt 
相關問題