Несколько (моей и сторонней) нативных библиотек в 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.

Это чудовищно. Но это работает. На момент. Хуже всего то, что контроль версий торпедирован.

Другие вопросы по тегам