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

时间:2015-11-25 17:43:20

标签: java android android-ndk rust libsodium

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

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

现在,我想使用我的两个预建库,A& B,在我的Android应用程序中。使用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函数,但我认为此时它可以忽略不计。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

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