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/
- library2/
- 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