2015-11-25 3 views
2

Я пишу приложение для 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, но я думаю, что на данный момент это незначительно. Любая помощь приветствуется!

+0

Я полагаю, что вы уже загрузили библиотеку 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

+0

Правильно, A загружается до B. Просто запустил nm и получил следующее выходы: 'T crypto_sign_ed25519_detached для libA.so U crypto_sign_ed25519_detached для libB.so' Любая идея, что это значит? –

+0

Я предполагаю, что у первого был ненулевой шестнадцатеричный адрес, напечатанный до 'T', а у последнего было пустое пространство перед' U'? Это означает, что libA.so имеет определение для символа, а libB.so имеет неопределенный символ с этим именем. Поэтому, учитывая это, это кажется правильным. – mstorsjo

ответ

1

После рабочего дня работы проблема была с версией libsodium, которую я использовал (1.0.6). Я обнаружил, что неопределенные символы при запуске ndk-build изменяются в зависимости от используемой версии. Использование libsodium v1.0.3 решило мои проблемы!