如何在 android studio 中添加预构建的 *.so 库?
How to add prebuilt *.so libraries in android studio?
我正在尝试整合 Hyperledger indy SDK。但是,当 运行 我的代码出现错误时
E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.UnsatisfiedLinkError: dlopen failed: library "libgnustl_shared.so" not found
at java.lang.Runtime.loadLibrary0(Runtime.java:1016)
at java.lang.System.loadLibrary(System.java:1657)
我正在尝试关注 documentation provided in the project repo. I tried using the sample project on this blog 。
- 我能够在 linux 虚拟机下构建 *.so 库,并在 windows.[=36= 上的 android 工作室项目中复制了构建文件]
- 我在项目的 jniLibs forlder 中为每个体系结构添加了文件。
- 添加代码以在我的 mainActivity 中加载库
static{
System.loadLibrary("indy");
}
- 尝试创建 CMake 文件
cmake_minimum_required(VERSION 3.4.1)
add_library(indy SHARED IMPORTED)
include_directories(src/main/jniLibs/${ANDROID_ABI}/include)
我的 gradle 文件包括:
android{
defaultconfig{
...
ndk{
moduleName "indy"
abiFilters 'armeabi-v7a'
}
}
...
sourceSets {
main {
jniLibs.srcDir 'src/main/jniLibs'
}
}
externalNativeBuild {
cmake {
path file('../CMakeLists.txt')
}
}
}
仍然,当我启动应用程序时,仍然出现相同的错误。
我知道在 linux 上构建库的 bash 脚本使用 android-ndk-r16b-linux-x86_64 工具,所以我尝试在 android studio 中降级我的 ndk 以使用相同的版本但没有运气。
构建脚本的输出是
include/
indy_anoncreds.h
indy_core.h
...
lib/
libindy.a
libindy.so
libindy_shared.so
如何在我的 android 工作室项目中使用这个库?
这个问题主要与图书馆的性质有关。库在 Android 中是动态的,需要在运行时 linked。
libindy.so
依赖于 stl、openssl、libsodium 和 libzmq。
你会在 NDK 中找到 libgnustl_shared.so
。
所有其他需要的预构建库也是 available here。
您需要做的是确保这些库存在于 jniLibs 文件夹中,并在 libindy 之前按顺序加载这些库。
System.loadLibrary("libgnustl_shared");
.
.
System.loadLibrary("indy");
替代方法:
Indy 中有一个子项目,我们在其中使用 libindy 作为依赖项,我们尝试创建一个包含所有依赖项的单一动态库。
Link
如果您按照 vcx 之类的步骤操作,则不必在 jniLibs 中拥有所有被告 l 库,因为它们已经是最终 .so 文件的一部分
创建一个包含所有符号和依赖项的胖动态库的命令是这个(来自上面粘贴的link)
${LIBVCX}/target/${CROSS_COMPILE}/release/libvcx.a \
${TOOLCHAIN_DIR}/sysroot/usr/${NDK_LIB_DIR}/libz.so \
${TOOLCHAIN_DIR}/sysroot/usr/${NDK_LIB_DIR}/libm.a \
${TOOLCHAIN_DIR}/sysroot/usr/${NDK_LIB_DIR}/liblog.so \
${LIBINDY_DIR}/libindy.a \
${TOOLCHAIN_DIR}/${CROSS_COMPILE_DIR}/${NDK_LIB_DIR}/libgnustl_shared.so \
${OPENSSL_DIR}/lib/libssl.a \
${OPENSSL_DIR}/lib/libcrypto.a \
${SODIUM_LIB_DIR}/libsodium.a \
${LIBZMQ_LIB_DIR}/libzmq.a \
${TOOLCHAIN_DIR}/${CROSS_COMPILE_DIR}/${NDK_LIB_DIR}/libgnustl_shared.so -Wl,--no-whole-archive -z muldefs
我正在尝试整合 Hyperledger indy SDK。但是,当 运行 我的代码出现错误时
E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.UnsatisfiedLinkError: dlopen failed: library "libgnustl_shared.so" not found
at java.lang.Runtime.loadLibrary0(Runtime.java:1016)
at java.lang.System.loadLibrary(System.java:1657)
我正在尝试关注 documentation provided in the project repo. I tried using the sample project on this blog 。
- 我能够在 linux 虚拟机下构建 *.so 库,并在 windows.[=36= 上的 android 工作室项目中复制了构建文件]
- 我在项目的 jniLibs forlder 中为每个体系结构添加了文件。
- 添加代码以在我的 mainActivity 中加载库
static{
System.loadLibrary("indy");
}
- 尝试创建 CMake 文件
cmake_minimum_required(VERSION 3.4.1)
add_library(indy SHARED IMPORTED)
include_directories(src/main/jniLibs/${ANDROID_ABI}/include)
我的 gradle 文件包括:
android{
defaultconfig{
...
ndk{
moduleName "indy"
abiFilters 'armeabi-v7a'
}
}
...
sourceSets {
main {
jniLibs.srcDir 'src/main/jniLibs'
}
}
externalNativeBuild {
cmake {
path file('../CMakeLists.txt')
}
}
}
仍然,当我启动应用程序时,仍然出现相同的错误。 我知道在 linux 上构建库的 bash 脚本使用 android-ndk-r16b-linux-x86_64 工具,所以我尝试在 android studio 中降级我的 ndk 以使用相同的版本但没有运气。
构建脚本的输出是
include/
indy_anoncreds.h
indy_core.h
...
lib/
libindy.a
libindy.so
libindy_shared.so
如何在我的 android 工作室项目中使用这个库?
这个问题主要与图书馆的性质有关。库在 Android 中是动态的,需要在运行时 linked。
libindy.so
依赖于 stl、openssl、libsodium 和 libzmq。
你会在 NDK 中找到 libgnustl_shared.so
。
所有其他需要的预构建库也是 available here。
您需要做的是确保这些库存在于 jniLibs 文件夹中,并在 libindy 之前按顺序加载这些库。
System.loadLibrary("libgnustl_shared");
.
.
System.loadLibrary("indy");
替代方法:
Indy 中有一个子项目,我们在其中使用 libindy 作为依赖项,我们尝试创建一个包含所有依赖项的单一动态库。 Link
如果您按照 vcx 之类的步骤操作,则不必在 jniLibs 中拥有所有被告 l 库,因为它们已经是最终 .so 文件的一部分
创建一个包含所有符号和依赖项的胖动态库的命令是这个(来自上面粘贴的link)
${LIBVCX}/target/${CROSS_COMPILE}/release/libvcx.a \
${TOOLCHAIN_DIR}/sysroot/usr/${NDK_LIB_DIR}/libz.so \
${TOOLCHAIN_DIR}/sysroot/usr/${NDK_LIB_DIR}/libm.a \
${TOOLCHAIN_DIR}/sysroot/usr/${NDK_LIB_DIR}/liblog.so \
${LIBINDY_DIR}/libindy.a \
${TOOLCHAIN_DIR}/${CROSS_COMPILE_DIR}/${NDK_LIB_DIR}/libgnustl_shared.so \
${OPENSSL_DIR}/lib/libssl.a \
${OPENSSL_DIR}/lib/libcrypto.a \
${SODIUM_LIB_DIR}/libsodium.a \
${LIBZMQ_LIB_DIR}/libzmq.a \
${TOOLCHAIN_DIR}/${CROSS_COMPILE_DIR}/${NDK_LIB_DIR}/libgnustl_shared.so -Wl,--no-whole-archive -z muldefs