看起来你有两个问题。首先是与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