看起來你有兩個問題。首先是與OpenSSL鏈接;其次是在APK中查找庫。
我使用的是C++庫,它是動態與openss-1.0.1^h庫鏈接...
這是你的第一個問題。 Android的相當於init
的是zygote
。 Zygote加載平臺的OpenSSL版本。當Zygote叉開始您的應用程序時,您的應用程序將獲得已經鏈接的OpenSSL版本,可能爲0.9.8。由於您的應用程序是針對1.0.1構建的,因此您將在運行時崩潰,因爲0.9.8和1.0.0是而不是二進制兼容。
要解決此問題,您必須構建一個包裝器共享對象,該對象與OpenSSL庫的靜態版本的鏈接。然後,當您需要進行OpenSSL調用時,您可以通過包裝器進行公開。例如,你可能有一個GetSslContext
換到OpenSSL的SSLv23_method
,SSL_CTX_new
,SSL_CTX_set_options
來電等
這避免調用到受精卵的下級OpenSSL的。它也記錄在OpenSSL wiki上OpenSSL and Android。
「無法找到libABC.so需要libssl.so.1.0.0」
這是你的第二個問題。首先,如上所述創建一個包裝器共享對象。其次,將共享對象放在適當的目錄中。共享包裝應放置在lib/
目錄中。我相信你也可以在子目錄中擁有專門的庫版本。例如,lib/
將是一個通用回退,而lib/armv7-a/
將是專爲ARMv7a構建的共享對象。
您可以在運行時庫與ApplicationInfo類及其nativeLibDir方法:
public String nativeLibraryDir
Full path to the directory where native JNI libraries are stored.
也看到Android的JNI Tips和機庫部分。
System.loadLibrary("ssl");
System.loadLibrary("crypto");
相關,libssl
取決於libcrypto
,所以它應該是:
static {
System.loadLibrary("crypto");
System.loadLibrary("ssl");
}
但你可能要避免它,並使用包裝共享對象。
來源
2014-06-26 11:42:39
jww
因此,請爲System.loadlibrary調用libssl。這就是你應該做的。 – nneonneo
但之前我從來沒有爲libssl調用System.loadlibrary,它與openssl-1.0.0一起工作 –
可能運氣不佳,系統可能會預裝libssl。您應該使用System.load庫手動加載任何依賴項。 – nneonneo