Подтвердить что ты не робот

NDK - Как использовать сгенерированную библиотеку .so в другом проекте

Я успешно использовал ndk для создания и использования файла .so в одном проекте. Мне нужно использовать эту библиотеку в другом проекте. Я бы предпочел не копировать источник там, а просто использовать библиотеку. Попытка скопировать и вставить весь файл libs/armeabi/libcommon.so в корень проекта не работает, я думаю, потому что libs/armeabi - это путь, созданный андроидами.

Итак, что было бы лучшим способом сделать это?

Я использую Eclipse-Galileo и ndk5.

4b9b3361

Ответ 1

Я выяснил, как это сделать, поэтому отправляйте его здесь, если кто-то еще столкнется с ним.

  • Код для совместного использования (включая оболочку Java JNI, собственный код,.so-библиотеку) должен быть в отдельном проекте. Преобразуйте это в проект библиотеки, щелкнув правой кнопкой мыши по имени проекта → свойства → свойства Android → отметьте галочкой "Библиотека". Этот проект не может выполняться сейчас, но на него могут ссылаться другие проекты.

  • В проекте, который будет использовать общий объект, добавьте ссылку на проект Libarray, щелкнув правой кнопкой мыши по имени проекта → свойства → свойства Android → Библиотека/ "Добавить". Это должно показать проект библиотеки, созданный на предыдущем шаге. Выберите его.

Теперь .so можно легко передать между различными проектами.

Ответ 2

Существует намного более простой способ сделать все это.

Скажем, что ваша предварительно построенная библиотека называется "libprebuilt.so"

В папке проекта нового проекта вы хотите включить только предварительно созданную библиотеку, выполните следующее:

mkdir -p jni/libprebuilt
cp libprebuilt.so jni/libprebuilt

Затем просто создайте файл jni/libprebuilt/Android.mk:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := libprebuilt
LOCAL_SRC_FILES := libprebuilt.so
include $(PREBUILT_SHARED_LIBRARY)

Затем, когда вы сделаете ndk-build, он скопирует эту библиотеку в libs/armeabi/..., что все!

Ответ 3

В именах функций JNI (Java Native Interface) есть имя пакета (например, JNIEXPORT void JNICALL Java_com_myapp_myclass_funct). Поэтому я думаю, вы должны переименовать эти funkcions в библиотеке, чтобы перекомпилировать его. Или, возможно, использовать его в качестве внешнего пакета в вашем приложении.