Несколько (моей и сторонней) нативных библиотек в Android NDK
Мне нужно использовать две нативные библиотеки: одна моя, а другая сторонняя. Пока я использовал их в отдельных проектах, все было хорошо. Но теперь я получаю Exception Ljava/lang/UnsatisfiedLinkError
,
Я использую Затмение.
Я обнаружил, что, если я помещаю существующую библиотеку в libs/armeabi, Eclipse начинает компиляцию нативного кода, и она не работает. Если я перекомпилирую часть JNI из командной строки, компиляция завершится успешно, но сторонняя библиотека исчезнет. Действительно глупо.
Итак, как мне сказать Eclipse использовать существующую библиотеку.so вместе с библиотекой, которая должна быть собрана? Библиотеки независимы.
2 ответа
NDK позволяет связывать с предварительно собранными пользовательскими библиотеками, используя переменную PREBUILT_SHARED_LIBRARY.
Предполагая, что библиотека, на которую вы хотите связать, - librandom.so, создайте libs
папка в jni
подпапка папки проекта:
mkdir -p jni/libs
cp librandom.so jni/libs
Затем просто создайте jni/libs/Android.mk
файл:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := random
LOCAL_SRC_FILES := librandom.so
include $(PREBUILT_SHARED_LIBRARY)
Вы можете создать раздел для каждой готовой библиотеки, все размещенные в jni/libs
,
Далее, вам просто нужно включить вышеуказанный файл в ваш jni/Android.mk, чтобы все заработало. В документах NDK рекомендуется делать это в конце Android.mk, а не в середине:
include $(LOCAL_PATH)/libs/Android.mk
Тем не менее, вам нужно будет сделать это до модуля, который требует эту библиотеку.
Для связывания вам необходимо добавить следующее в раздел модуля, который ссылается на предварительно собранную библиотеку.
LOCAL_SHARED_LIBRARIES := random
Затем, когда вы выполните ndk-build, она скопирует эту библиотеку в libs/armeabi/
перед сборкой модуля, и все готово.
Примечание. Это не решает проблемы с необходимыми заголовками. Вам все еще нужно будет добавить расположение переменных для библиотеки в переменную LOCAL_C_INCLUDES
в модуле, который требует этого.
Это то, что я сделал на данный момент. Я не приму (в смысле stackru) мой собственный (этот) ответ, потому что он неудовлетворительный.
Я создал новый проект и скопировал все файлы Java там. Затем я скопировал библиотеку.so из старого проекта и стороннюю библиотеку в libs / armeabi.
Это чудовищно. Но это работает. На момент. Хуже всего то, что контроль версий торпедирован.