无法在 Android 项目中加载预构建的 OpenSSL 库

Cannot load prebuilt OpenSSL library in Android project

我正在尝试 link OpenSSL .so 预构建文件,以便我可以在我的本机 C 文件中使用它。在我的项目中,我创建了 native_hello.c 文件并且它工作正常,C 代码运行,但是当我尝试

System.loadLibrary("crypto");
System.loadLibrary("ssl");

在我的 java 加载 OpenSSL .so 文件的代码中,应用程序崩溃并出现错误

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

我继续反编译源 apk 文件,果然 lib 文件夹中没有 libcrypto.solibssl.so 文件。 我将 CMake 用于 linking 本机文件:

CMakeLists.txt

cmake_minimum_required(VERSION 3.6.0)

set(distribution_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src/main)

add_library(lib_crypto SHARED IMPORTED)
set_target_properties(lib_crypto PROPERTIES IMPORTED_LOCATION ${distribution_DIR}/jniLibs/${ANDROID_ABI}/lib/libcrypto.so)

# add the open ssl lib
add_library(lib_ssl SHARED IMPORTED)
set_target_properties(lib_ssl PROPERTIES IMPORTED_LOCATION ${distribution_DIR}/jniLibs/${ANDROID_ABI}/lib/libssl.so)

add_library(native-test SHARED
        ${distribution_DIR}/jni/native_hello.c)

target_include_directories(native-test PRIVATE ${distribution_DIR}/jniLibs/${ANDROID_ABI}/include)

target_link_libraries(native-test
        lib_crypto
        lib_ssl)

在相关问题中,解决方案之一是在 build.gradle 中使用 sourceSets,但使用以下代码片段仍然缺少 .so 文件:

sourceSets {
    main {
        // let gradle pack the shared library into apk
        jniLibs.srcDirs = ['src/main/jniLibs']
    }
}

我觉得这个问题很简单,但是我不知道怎么解决。任何帮助将不胜感激

原来我的 jniLibs 的结构是这样的:

arm64-v8a
    include
        ...
    lib
        libcrypto.so
        libssl.so
x86
    include
        ...
    lib
        ...

反对:

arm64-v8a
    include
        ...
    libcrypto.so
    libssl.so
x86
    include
        ...
    ...

这解决了最初的问题。