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

时间:2019-09-26 23:52:23

标签: android c cmake openssl native

我正在尝试链接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文件进行反编译,并确保libcrypto.so文件夹中没有libssl.solib文件。 我正在使用CMake链接本机文件:

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)

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

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

我认为这个问题很容易,但是我不知道该如何解决。任何帮助将不胜感激

1 个答案:

答案 0 :(得分:0)

事实证明,我的jniLib的结构类似于:

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

反对:

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

解决了最初的问题。