我已经交叉编译了适用于 Android 的 OpenSSL(
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]
文件丢失/未找到。
如果有人能帮我解决这个问题,我将非常感激,我开始对此失去理智了!
干杯
我相信,如果该文件名为“libcrypto.so”,您应该使用以下方式请求它:
System.loadLibrary(“加密”);