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

问题描述 投票:0回答:1

我已经交叉编译了适用于 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]
文件丢失/未找到。

如果有人能帮我解决这个问题,我将非常感激,我开始对此失去理智了!

干杯

android apk cross-compiling
1个回答
1
投票

我相信,如果该文件名为“libcrypto.so”,您应该使用以下方式请求它:

System.loadLibrary(“加密”);

© www.soinside.com 2019 - 2024. All rights reserved.