NDK скомпилирует несколько библиотек

Я использую собственный код в своем приложении для Android. Во-первых, я использовал только одну библиотеку. Так что все сработало хорошо. Но теперь мне нужно интегрировать в него еще одну библиотеку. Я не знаю, какая должна быть идеальная структура jni-папки моего проекта (как в том, где разместить весь код и т.д.). Я нашел работу. Я создал две папки внутри jni.i.e library1 и library2. Снова создала папку jni внутри обеих папок и разместила соответствующий код в папках.

Я получил его для компиляции. Оба .so файла сгенерированы, но я не могу использовать его в своем приложении. Я не могу загрузить библиотеку с помощью System.loadLibrary( "library1.so" ); Также попытался предоставить полный путь. Но не удалось

Также я понятия не имею, что писать внутри родительского jni файла Android.mk.

Текущая структура: project_folder → jni → library1 → jni → "исходный код", здесь написан Android.mk project_folder → jni → library2 → jni → "исходный код" здесь написан Android.mk

ОБНОВЛЕНИЕ # 1:

Gdbserver      : [arm-linux-androideabi-4.6] libs/armeabi/gdbserver
Gdbsetup       : libs/armeabi/gdb.setup
make: *** No rule to make target `jni/zap/jni/zap/zap/error.c', needed by `obj/local/armeabi/objs-debug/zap/jni/zap/zap/error.o'.  Stop.

Я не использую Application.mk. Это мой Android.mk:

TOP_PATH := $(call my-dir)

# Build library 1
include $(CLEAR_VARS)
LOCAL_PATH := $(TOP_PATH)/zap
LOCAL_MODULE := zap
LOCAL_C_INCLUDES := $(LOCAL_PATH)/zap
LOCAL_SRC_FILES := $(LOCAL_PATH)/zap/error.c \
$(LOCAL_PATH)/zap/hello-jni.c \
$(LOCAL_PATH)/zap/zap.c \
$(LOCAL_PATH)/zap/zapd.c \
$(LOCAL_PATH)/zap/zaplib.c 
include $(BUILD_SHARED_LIBRARY)

Ответы

Ответ 1

Лучшей структурой, которую я нашел, является использование jni/folder только для make файлов ndk-build и сохранение источника снаружи в их собственных папках. Это легко добавить к существующим проектам без реструктуризации дерева под jni.

Однако вам нужно быть осторожным в том, как вы обрабатываете переменную LOCAL_PATH и используете $(call my-dir). Вот рабочий пример:

  • MyProject/
    • Library1/
      • source1.cpp
    • library2/
      • source2.cpp
    • JNI/
      • Android.mk
      • Application.mk

Android.mk:

# TOP_PATH refers to the project root dir (MyProject)
TOP_PATH := $(call my-dir)/..

# Build library 1
include $(CLEAR_VARS)
LOCAL_PATH := $(TOP_PATH)/library1
LOCAL_MODULE := library1
LOCAL_C_INCLUDES := $(LOCAL_PATH)
LOCAL_SRC_FILES := source1.cpp
include $(BUILD_SHARED_LIBRARY)

# Build library 2
include $(CLEAR_VARS)
LOCAL_PATH := $(TOP_PATH)/library2
LOCAL_MODULE := library2
LOCAL_C_INCLUDES := $(LOCAL_PATH)
LOCAL_SRC_FILES := source2.cpp
include $(BUILD_SHARED_LIBRARY)

Вы можете дополнительно разделить разделы в Android.mk на свои собственные make файлы.

Ответ 2

Я обнаружил, что при компиляции из командной строки я могу включить несколько библиотек, выполнив android update project дважды, один раз с каждой библиотекой:

android update project -l ../SDK/library1/ --path . --name $name --target 23  --subprojects
android update project -l ../SDK/library2/ --path . --name $name --target 23  --subprojects
ant release