无法在 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.so
或 libssl.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
...
...
这解决了最初的问题。
我正在尝试 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.so
或 libssl.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
...
...
这解决了最初的问题。