0

我正在尝试集成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)

我正在尝试遵循项目回购中提供的文档。我尝试使用此博客上的示例项目。

  • 我能够在 linux 虚拟机下构建 *.so 库,将构建的文件复制到我在 windows 上的 android studio 项目中。
  • 我在项目的 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 studio 项目中使用这个库?

4

1 回答 1

0

这个问题主要与图书馆的性质有关。库在 Android 中是动态的,需要在运行时链接。

libindy.so依赖于 stl、openssl、libsodium 和 libzmq。你会libgnustl_shared.so在 NDK 中找到。所有其他需要的预建库也可以在这里找到

您需要做的是确保这些库存在于 jniLibs 文件夹中,并在 libindy 之前按顺序加载这些库。

System.loadLibrary("libgnustl_shared");
.
.
System.loadLibrary("indy");

替代方法:

Indy 中有一个子项目,我们使用 libindy 作为依赖项,我们尝试创建一个包含所有依赖项的胖动态库。 关联

如果您按照 vcx 之类的步骤进行操作,则不必将所有被告 l 库都放在 jniLibs 中,因为它们已经是最终 .so 文件的一部分

使用所有符号和依赖项创建一个胖动态库的命令是这个(来自上面粘贴的链接)

${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
于 2019-04-05T05:29:55.190 回答