2012-06-12 45 views
2

我需要在我的應用程序中運行比操作系統中更新版本的openssl。我能夠修補和Android源代碼來編譯更新的版本,然後提取共享庫以在我的應用程序中使用。Android無法加載本地libcrypto不滿意的鏈接錯誤

然後,我能夠編譯和鏈接我的本機代碼,它只需要在較新版本的openssl中針對我的新共享庫(更新的openssl的補丁工作)。

我也能夠創建一些按預期工作的jni函數,但只要在應用程序本地的較新的openssl共享庫中添加函數,我就會得到一個不滿意的鏈接錯誤。

我的假設是,libcrypto和libssl的系統版本正在覆蓋我的本地版本/libs/armeabi/libcrypto.so和/libs/armeabi/libssl.so ....如何解決這個問題?

回答

4

該系統已經附帶一個名爲libcrypto的庫,並且該庫將在您的庫之前被選中。最簡單的解決方案是給你的圖書館一個不同的名字,並在你的System.loadLibrary(...)調用中使用。

更新

正如你指出的那樣,你需要用新的名稱來重建庫,在短短重命名文件代替。

+0

我試圖將libcrypto.so的文件名更改爲其他內容,但沒有奏效。文件名不重要,我必須在openssl構建中更改它? –

+1

確實,您需要用這個新名稱重建庫。我根據您的建議更新了答案。 –

0

是JNI正在挑選系統版本。它根本沒有使用你的補丁版本。在獨立JVM上,您會說-Djava.library.path=/libs/armeabi或修改環境變量LD_LIBRARY_PATH。在Android上,我猜你可以查看系統屬性java.library.path,並把你的libs放在一些已知的位置(但是在系統版本所在的文件夾之前)或者實際修改屬性 - 在你的本地版本。我對Android有一些經驗,但不是專門與NDK合作。

相關問題