【问题标题】:Android - OpenSSL 1.1.1 UnsatisfiedLinkErrorAndroid - OpenSSL 1.1.1 UnsatisfiedLinkError
【发布时间】:2019-07-17 20:54:42
【问题描述】:

我一直在使用 Android 版本的 OpenSSL 1.1.1。在我的模块的 CMake 中,我将 libssl 称为 SHAREDIMPORTED 并将其与模块自己的库链接。当使用STATIC lib 时,编译抛出

“未定义对标准输入、标准错误的引用。”

目前,我选择了动态,编译没问题,但运行时出现以下错误:

java.lang.UnsatisfiedLinkError: dlopen failed: library "libssl.so" not found.

对象在那里并且有相关的函数定义。

使用this 进行构建。目标 API 级别 26 并使用 NDK 版本 19。

也许我正在使用错误的选项进行构建?兼容性?还是应该降低目标版本?

【问题讨论】:

  • 请确保您的.apk每个 目录/lib/%BUILD_TARGET% 中包含libssl.so,其中BUILD_TARGET 来自您的构建脚本(BUILD_TARGETS="armeabi armeabi-v7a arm64-v8a x86 x86_64")。确保您的目标设备支持任何该架构。还请发布加载本机库的代码。
  • 它实际上没有显示 libssl.so 和 libcrypto.so,我想这可能不会导致它们被导入并链接到我自己的库。但是,奇怪的是现在我自己的 lib(libsecurity.so) 没有出现,所以显然那里是错误的。谢谢你。此外,我不会以 JNI 格式包装 OpenSSL 并将它们加载到 Java 端。我在 C(安全模块)中有函数调用,只有头文件和库链接。不行吗?

标签: android android-ndk openssl


【解决方案1】:

目标 API 级别 26

“未定义对标准输入、标准错误的引用。”

看起来 openssl 是为 26 构建的,但您的应用是为 23 之前构建的。请参阅https://android.googlesource.com/platform/ndk/+/master/docs/user/common_problems.md#using-mismatched-prebuilt-libraries 下的第一个项目符号

您的minSdkVersion 不能低于您所有依赖项的最大minSdkVersion

java.lang.UnsatisfiedLinkError: dlopen failed: library "libssl.so" not found.

您的 APK 中似乎没有包含它?

【讨论】:

  • 这是版本控制。谢谢你。还再次获得“未定义的参考 inflateInit”以及与 zLib 相关的更多内容,在 openSSL ./Configure 选项中使用了“no-comp”。 libssl.so 是在构建脚本之后生成的,带有指向 libssl.so.1.1(不存在)的符号链接。这就是它找不到的原因。放置虚拟文件来克服。
【解决方案2】:

答案here 可以完美构建openssl。

当您尝试集成libssl.solibcrypto.so 时,您必须按如下方式组织您的目录结构。

目录结构

openssl_android/lib/
    ├── arm64-v8a/                       <-- ARM 64bit
    │   └── libssl.so
    ├── armeabi-v7a/                     <-- ARM 32bit
    │   └── libssl.so
    ├── x86_64/                          <-- Intel 64bit
    │   └── libssl.so
    └── x86/                             <-- Intel 32bit
        └── libssl.so

更新您的 gradle 文件

将以下行添加到您的 app/build.gradle 文件中,让 gradle 将您的 jniLibs 指向 openssl

android {
    ...

    sourceSets {
        main {
            jniLibs.srcDirs += ['<path-to-openssl>/openssl_android/lib']
        }
    }
}

注意:路径必须是openssl_android/lib的级别,即ABIs的父目录。

【讨论】:

  • 谢谢。我正在以相同的方式构建和获取库。
  • gradle 配置将帮助您将库打包到您的 apk 中
猜你喜欢
  • 2019-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-29
  • 2020-05-29
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
相关资源
最近更新 更多