Я пишу приложение для Android, которое основано на двух готовых общих библиотеках (A и B). Обе библиотеки настроены для работы с архитектурами armeabi и armeabi-v7a.Android NDK: две готовые общие библиотеки, но одна из них зависит от другой
Первая готовая библиотека, A, является libsodium. Вторая библиотека, созданная ранее, B, является библиотекой Rust, которая зависит от libsodium. При компиляции предварительно созданной библиотеки Rust, libsodium используется как зависимость.
Прямо сейчас, я хочу использовать две мои готовые библиотеки, A & B, в приложении для Android. Загрузка A с использованием System.loadLibrary() работает отлично. Но когда я загружаю 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)
Ржавчина-менеджер. c-файл - это моя C-оболочка, сгенерированная с использованием javah, которая содержит функции C, которые отображают мои собственные функции Java в библиотеке Rust, но я думаю, что на данный момент это незначительно. Любая помощь приветствуется!
Я полагаю, что вы уже загрузили библиотеку A при загрузке библиотеки B? Можете ли вы попробовать «arm-linux-androideabi-nm -D libA.so | grep crypto_sign_ed25519_detached' и аналогично для libB.so? (Вы находите двоичный 'nm' в' NDK/toolchains/arm-linux-androideabi-4. */Prebuilt/*/bin'.) – mstorsjo
Правильно, A загружается до B. Просто запустил nm и получил следующее выходы: 'T crypto_sign_ed25519_detached для libA.so U crypto_sign_ed25519_detached для libB.so' Любая идея, что это значит? –
Я предполагаю, что у первого был ненулевой шестнадцатеричный адрес, напечатанный до 'T', а у последнего было пустое пространство перед' U'? Это означает, что libA.so имеет определение для символа, а libB.so имеет неопределенный символ с этим именем. Поэтому, учитывая это, это кажется правильным. – mstorsjo