外部库和JNI与Android:dlopen失败:库“libcrypto.so.1.1”未找到,即使SONAME设置正确

ltqd579y  于 12个月前  发布在  Android
关注(0)|答案(2)|浏览(230)

bounty明天到期。回答此问题有资格获得+50声望奖励。mavavilj正在寻找规范答案

我交叉编译了OpenSSL for Android(x86arm)。我通过使用jniLibsbuild.gradle.so文件(分别为:libcrypto.solibssl.so)添加到生成的.apk文件中。我检查了,.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库,并在MainActivity中使用它:LibraryWrapper.TestMethod();。此方法先调用Client方法,然后调用Agent方法。当到达Agent方法时,并试图加载libcryto.so文件...应用程序崩溃,我受到通常的错误信息的欢迎。
注意事项:如果我从Agent库(使用libcrypto.so.1.1的库)中删除调用方法的部分,应用程序运行正常,这证明问题可能只是来自libcrypto.so[.1.1]文件丢失/未找到。
如果有人能帮我,我会非常感激,我开始失去我的头脑在这!
欢呼

yhuiod9q

yhuiod9q1#

我认为,如果文件名为“libcrypto.so“,您应该使用以下命令请求它:
System. out. println(“println”);

fkaflof6

fkaflof62#

基于以下信息:
https://stackoverflow.com/a/55080634/4959635
Android的Gradle不支持versioned .sos,因此您应该以使用和构建无版本控制的库为目标。

相关问题