繁体   English   中英

Android NDK:两个预构建的共享库,但其中一个依赖于另一个

[英]Android NDK: Two prebuilt shared libraries, but one of them depends on the other

我正在编写一个 Android 应用程序,它依赖于两个预构建的共享库(A 和 B)。 这两个库都配置为与 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 函数,但我认为此时它可以忽略不计。 任何帮助将非常感激!

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM