我正在尝试链接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.so
或lib
文件。
我正在使用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']
}
}
我认为这个问题很容易,但是我不知道该如何解决。任何帮助将不胜感激
答案 0 :(得分:0)
事实证明,我的jniLib的结构类似于:
arm64-v8a
include
...
lib
libcrypto.so
libssl.so
x86
include
...
lib
...
反对:
arm64-v8a
include
...
libcrypto.so
libssl.so
x86
include
...
...
解决了最初的问题。