java - Android NDK : Two prebuilt shared libraries, 但其中一个依赖于另一个

标签 java android android-ndk rust libsodium

我正在编写一个依赖于两个预建共享库(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 失败:无法找到“libB.so”引用的符号“crypto_sign_ed25519_detached”...

我的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 包装器,它包含将我的 native Java 函数映射到 Rust 库的 C 函数,但我认为此时它可以忽略不计。任何帮助将不胜感激!

最佳答案

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

关于java - Android NDK : Two prebuilt shared libraries, 但其中一个依赖于另一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33923142/

相关文章:

java - 当我尝试通过我的 Google Suite 帐户发送电子邮件时,Gmail API 返回 failedPrecondition 错误

java - 是字母还是数字错误

java - 防止 JMenuItem 在单击时关闭 JMenu

android NDK互斥锁定

android - GLES 3.0 包括 gl2ext.h

java - 从命令 com.google.analyticsreporting.v4 包运行的 Google Analytics API 4 Java 客户端不存在

android - @font-face 无法在 Android 上的 Chrome 中呈现

android - 为什么基于 GPS 的安卓应用程序没有安装在基于辅助 GPS (A-GPS) 的安卓设备上?

java - 如何从 Firebase (java) 中检索最后一个 child ?

java - 在 Android 中使用 OpenCV 非自由模块