2014-06-26 26 views
1

我正在使用C++库。它与openss-1.0.1h库(即libssl.so,libcrypto.so)和openssl库是动态链接的。问题是当我尝试使用我的android应用程序加载库时,应用程序崩溃。而在日志中的猫,我可以看到的东西的原因这样的 - 我没有叫的System.loadLibrary()加载C++ jni库时应用程序崩溃动态链接openss-1.0.1h

“无法找到libABC.so需要libssl.so.1.0.0”

OpenSSL的库,我只为我的C++库调用。

当我使用openssl-1.0.0的动态链接或openssl-1.0.1h的静态链接时,此问题从不起作用。

我不知道如何解决这个问题。任何人都可以帮我解决这个问题吗?

我没下加载库 -

System.loadLibrary("ssl"); 
System.loadLibrary("crypto"); 
System.loadLibrary("ABC"); 
+0

因此,请为System.loadlibrary调用libssl。这就是你应该做的。 – nneonneo

+0

但之前我从来没有为libssl调用System.loadlibrary,它与openssl-1.0.0一起工作 –

+1

可能运气不佳,系统可能会预装libssl。您应该使用System.load库手动加载任何依赖项。 – nneonneo

回答

2

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

但你可能要避免它,并使用包装共享对象。

+1

你可以请参阅我的链接,我可以找到足够的引用来创建openssl的包装? –

+1

@naseef - 以下是我在学习时使用的内容:[Android Native Development Kit Cookbook](http://www.amazon.com/dp/1849691509)。您可以从Packet Publishing在线找到示例章节。幸运的是,它们提供了第8章和第9章,这是你需要的章节。 – jww

+0

非常感谢你:) –