несколько (моих и сторонних) нативных библиотек в Android NDK

Мне приходится использовать две нативные библиотеки: одну мою, а другую стороннюю. Пока я использовал их в отдельных проектах, все было ок. Но теперь я получаю Exception Ljava/lang/UnsatisfiedLinkError.

Я использую Эклипс.

Я обнаружил, что если я помещу существующую библиотеку в libs/armeabi, Eclipse начнет компиляцию нативного кода и завершится ошибкой. Если я перестрою часть JNI из командной строки, компиляция пройдет успешно, но сторонняя библиотека исчезнет. Действительно глупо.

Итак, как мне указать Eclipse использовать существующую библиотеку .so вместе с библиотекой, которую необходимо собрать? Библиотеки независимы.


person 18446744073709551615    schedule 28.04.2012    source источник


Ответы (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 в модуле, которому это требуется.

person Samveen    schedule 28.04.2012
comment
ОБНОВЛЕНИЕ: если одна библиотека зависит от другой, см. stackoverflow.com/questions/17688327/ - person 18446744073709551615; 18.04.2014

Это то, что я сделал на данный момент. Я не приму (в смысле stackoverflow) свой собственный (этот) ответ, потому что он неудовлетворителен.

Я создал новый проект и скопировал туда все файлы Java. Затем я скопировал библиотеку .so из старого проекта и стороннюю библиотеку в libs/armeabi.

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

person 18446744073709551615    schedule 28.04.2012