【问题标题】:Android NDK: Two prebuilt shared libraries, but one of them depends on the otherAndroid NDK:两个预构建的共享库,但其中一个依赖于另一个
【发布时间】:2015-11-25 17:43:19
【问题描述】:

我正在编写一个依赖于两个预构建共享库(A 和 B)的 Android 应用程序。这两个库都配置为使用 armeabi 和 armeabi-v7a 架构。

第一个预建库 A 是 libsodium。第二个预构建库 B 是一个依赖于 libsodium 的 Rust 库。编译 Rust 预建库时,使用 libsodium 作为依赖项。

现在,我想在我的 Android 应用程序中使用我的两个预构建库 A 和 B。使用 System.loadLibrary() 加载 A 工作得很好。但是当我加载B时,出现B找不到A中定义的方法的错误:

java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "crypto_sign_ed25519_detached" referenced by "libB.so"...

我的Android.mk如下:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := sodium
LOCAL_SRC_FILES := ../jniLibs/$(TARGET_ARCH_ABI)/libsodium.so
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include/sodium.h $(LOCAL_PATH)/include/sodium/
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := rust
LOCAL_SRC_FILES := ../jniLibs/$(TARGET_ARCH_ABI)/librust.so
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include/sodium.h $(LOCAL_PATH)/include/sodium/
LOCAL_SHARED_LIBRARIES := sodium
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE    := rust-manager
LOCAL_SRC_FILES := rust-manager.c
LOCAL_SHARED_LIBRARIES := rust sodium
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include/ $(LOCAL_PATH)/include/sodium.h $(LOCAL_PATH)/include/sodium/
include $(BUILD_SHARED_LIBRARY)

rust-manager.c 文件是我使用 javah 生成的 C 包装器,其中包含将我的本机 Java 函数映射到 Rust 库的 C 函数,但我认为目前可以忽略不计。任何帮助将不胜感激!

【问题讨论】:

  • 我认为您在加载库 B 时已经加载了库 A?你能试试arm-linux-androideabi-nm -D libA.so | grep crypto_sign_ed25519_detached 和类似的libB.so 吗? (您可以在 NDK/toolchains/arm-linux-androideabi-4.*/prebuilt/*/bin 中找到 nm 二进制文件。)
  • 没错,A 在 B 之前被加载。刚刚运行 nm 并收到以下输出:T crypto_sign_ed25519_detached for libA.so U crypto_sign_ed25519_detached for libB.so 知道这意味着什么吗?
  • 我假设前者在T 之前打印了一个非零十六进制地址,而后者在U 之前有空格?这只是意味着 libA.so 具有符号的定义,而 libB.so 具有具有该名称的未定义符号。因此,考虑到这一点,它似乎是正确的。
  • 哦,有趣。这是否意味着 libB 的配置不正确,或者可能发生了一些不需要的优化,从而从最终对象中省略了此方法?
  • 不,这意味着 libB 使用这个函数(或变量),而 libA 提供了它——这一切似乎都是正确的,就像它应该的那样。问题是为什么在您已经加载 libA 时尝试加载 libB 时找不到它。

标签: java android android-ndk rust libsodium


【解决方案1】:

经过一天的工作,问题出在我使用的 libsodium 版本 (1.0.6) 上。我发现运行 ndk-build 时未定义的符号因使用的版本而异。使用 libsodium v​​1.0.3 解决了我的问题!

【讨论】:

    猜你喜欢
    • 2014-03-22
    • 1970-01-01
    • 2017-10-26
    • 2017-04-06
    • 1970-01-01
    • 2013-07-19
    • 1970-01-01
    • 2012-05-21
    • 2018-02-12
    相关资源
    最近更新 更多