Android - OpenSSL 1.1.1 UnsatisfiedLinkError

Android - OpenSSL 1.1.1 UnsatisfiedLinkError

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

"Undefined reference to stdin, stderr."

现在,我选择动态并且编译没问题,但在运行时出现以下错误:

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

对象存在,并且有相关的函数定义。

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

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

答案可以完美构建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 的父目录。

Target API level 26

"Undefined reference to stdin, stderr."

看起来 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 中?