外部库和JNI与Android:dlopen失败:library" libcrypto.so.1.1"即使SONAME设置正确,也找不到

时间:2018-02-22 13:57:07

标签: android apk cross-compiling

我已经交叉编译了OpenSSL for Android(x86arm)。我使用.solibcrypto.solibssl.so个文件(分别为:.apkjniLibs)添加到生成的build.gradle文件中。我已经检查过,.so文件已正确打包在生成的.apk中。

现在,.so文件已正确命名:

$ objdump -p libssl.so | grep SONAME
  SONAME               libssl.so.1.1
$ objdump -p libcrypto.so | grep SONAME
  SONAME               libcrypto.so.1.1

然而,当代码执行时,我收到以下错误:java.lang.UnsatisfiedLinkError: dlopen failed: library "libcrypto.so.1.1" not found

我在标题中提到我使用的是JNI,因为问题实际上是在创建其中一个JNI模块时出现的。

我的项目结构如下:

  • 我有一个JNILibrary Android Studio项目,其目标是生成一个Android库(.aar文件)。它有2个.java类:AgentWrapper.javaClientWrapper.java,它们都公开了本机方法。 CMakeLists.txt文件编译C(JNI)代码,生成的.so文件(libagent.solibclient.so)捆绑在最终.aar中。

  • JNILibrary Android Studio项目还包含LibraryWrapper.java类;它包含处理JNI中实现的本机方法的抽象方法(可通过AgentWrapper.javaClientWrapper.java访问)。

  • AgentWrapper.java的C代码使用OpenSSL库。它依赖于libcrypto.solibssl.so,它们都捆绑在生成的.aar中。

完成后,我创建了另一个Android Studio项目JNILibraryTestApk。我导入以前生成的.aar库,并在我的MainActivityLibraryWrapper.TestMethod();中使用它。此方法调用Client方法,然后调用Agent方法。当它到达Agent方法,并尝试加载libcryto.so文件时...应用程序崩溃,我会收到通常的错误消息。

注意:如果我从Agent库(使用libcrypto.so.1.1)中删除调用方法的部分,则应用程序运行正常,这证明问题可能仅来自libcrypto.so[.1.1]文件丢失/找不到。

如果有人能帮助我,我真的很感激,我开始对此失去理智!

干杯

1 个答案:

答案 0 :(得分:0)

我相信如果文件名为“libcrypto.so”,您应该使用以下命令来申请:

的System.loadLibrary( “密码”);