bounty明天到期。回答此问题有资格获得+50声望奖励。mavavilj正在寻找规范答案。
我交叉编译了OpenSSL for Android(x86
和arm
)。我通过使用jniLibs
到build.gradle
将.so
文件(分别为:libcrypto.so
和libssl.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.java
和ClientWrapper.java
,它们都公开了本机方法。CMakeLists.txt
文件编译C(JNI)代码,并且所生成的.so
文件(libagent.so
和libclient.so
)被捆绑在最终的.aar
中。 - 此
JNILibrary
Android Studio项目还包含一个LibraryWrapper.java
类;它包含处理JNI中实现的本机方法的抽象方法(可通过AgentWrapper.java
和ClientWrapper.java
访问)。 AgentWrapper.java
的C代码使用OpenSSL库。它依赖于libcrypto.so
和libssl.so
,这两个都捆绑在生成的.aar
中。
完成后,我创建了另一个Android Studio项目JNILibraryTestApk
。我导入了之前生成的.aar
库,并在MainActivity
中使用它:LibraryWrapper.TestMethod();
。此方法先调用Client
方法,然后调用Agent
方法。当到达Agent
方法时,并试图加载libcryto.so
文件...应用程序崩溃,我受到通常的错误信息的欢迎。
注意事项:如果我从Agent
库(使用libcrypto.so.1.1
的库)中删除调用方法的部分,应用程序运行正常,这证明问题可能只是来自libcrypto.so[.1.1]
文件丢失/未找到。
如果有人能帮我,我会非常感激,我开始失去我的头脑在这!
欢呼
2条答案
按热度按时间yhuiod9q1#
我认为,如果文件名为“libcrypto.so“,您应该使用以下命令请求它:
System. out. println(“println”);
fkaflof62#
基于以下信息:
https://stackoverflow.com/a/55080634/4959635
Android的Gradle不支持versioned .sos,因此您应该以使用和构建无版本控制的库为目标。