我已经交叉编译了OpenSSL for Android(x86
和arm
)。我使用.so
到libcrypto.so
将libssl.so
个文件(分别为:.apk
和jniLibs
)添加到生成的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.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]
文件丢失/找不到。
如果有人能帮助我,我真的很感激,我开始对此失去理智!
干杯
答案 0 :(得分:0)
我相信如果文件名为“libcrypto.so”,您应该使用以下命令来申请:
的System.loadLibrary( “密码”);