NDK - Как использовать сгенерированную библиотеку .so в другом проекте
Я успешно использовал ndk для создания и использования файла .so в одном проекте. Мне нужно использовать эту библиотеку в другом проекте. Я бы предпочел не копировать источник там, а просто использовать библиотеку. Попытка скопировать и вставить весь файл libs/armeabi/libcommon.so в корень проекта не работает, я думаю, потому что libs/armeabi - это путь, созданный андроидами.
Итак, что было бы лучшим способом сделать это?
Я использую Eclipse-Galileo и ndk5.
Ответы
Ответ 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 в библиотеке, чтобы перекомпилировать его. Или, возможно, использовать его в качестве внешнего пакета в вашем приложении.