Изменение местоположений вывода ndk-build
Мое приложение имеет следующую структуру
Android
|
|-> app
| |
| |-> build [1]
| |-> src
| | |-> main
| | | |-> assets
| | | |-> java
| | | |-> jni
| | | | |-> Android.mk
| | | | |-> Application.mk
| | | |
| | | |-> jniLibs
| | | | |-> armeabi
| | | | |-> armeabi-v7a
| | | |
| | | |-> res
| | | |-> AndroidManifest.xml
|
|-> build [2]
Я создаю библиотеки .so
с помощью команды ndk-build
в Linux-машине. Я использую его как:
<my_ndk_location_path>/ndk-build -C <my_project_location_path>/Android/app/src/main/
Процесс сборки работает отлично, и выходные файлы создаются без ошибок.
Моя проблема заключается в том, что файлы результатов не "направлены в правильное положение"
libs
, сгенерированный при:
.app/src/main/libs/armeabi-v7a/libMyGeneratedLibrary.so
.app/src/main/libs/armeabi/libMyGeneratedLibrary.so
и obj
файлы:
.app/src/main/obj/local/armeabi-v7a/libMyGeneratedLibrary.so
.app/src/main/obj/local/armeabi/libMyGeneratedLibrary.so
Я хотел бы, чтобы результат производился в разных местах:
-
libs
в jniLibs
.
то есть. ./app/src/main/jniLibs/armeabi*
-
obj
в одной из папок сборки. то есть. build
[1] или build
[2].
Есть ли какой-либо возможный способ добиться этого, изменив какой-либо параметр на файлы .mk
или на команду сборки?
Edit
TARGET_OUT
, похоже, не работает в NDK r6b
Выполнение команды ndk-build -C Android/app/src/main/ TARGET_OUT='Android/app/src/main/jniLibs/$(TARGET_ARCH_ABI)'
Предупреждения, как показано ниже для каждого сгенерированного файла.
android-ndk-r6b/build/core/build-binary.mk:217: warning: overriding commands for target 'Android/app/src/main/jniLibs//objs/***/****.o'
android-ndk-r6b/build/core/build-binary.mk:217: warning: ignoring old commands for target 'Android/app/src/main/jniLibs//objs/***/****.o'
Ответы
Ответ 1
Как я его решаю. Не очень элегантный, но, по крайней мере, он работает.
Поскольку мой механизм построения довольно сложный, поэтому у меня было несколько пользовательских задач и скриптов gradle тоже, для меня не имеет особого значения одна команда для сборки.
Итак, я сохранил команду build как
<my_ndk_path>/ndk-build -C <my_project_path>/Android/app/src/main/
Добавить создание папки (-p не генерировать ошибку, если она существует)
mkdir -p <my_project_path>/Android/app/src/main/jniLibs/
Затем я перемещаю файлы .so в конечное местоположение с помощью команды sync.
rsync -avh --remove-source-files \
<my_project_path>/Android/app/src/main/libs/* \
<my_project_path>/Android/app/src/main/jniLibs/
Вы можете сделать что-то подобное для папки obj
. Я только что изменил свой .gitignore, поэтому оставил его как есть.
Ответ 2
Вы можете использовать NDK_LIBS_OUT
для изменения вывода libs и NDK_OUT
для изменения вывода obj.
Точно так же: ndk-build NDK_LIBS_OUT=./jniLibs NDK_OUT=./obj
Ответ 3
Если вам нужно построить для всех доступных архитектур, используйте аргумент:
TARGET_OUT='<your_build_dir>/$(TARGET_ARCH_ABI)'
Если достаточно одной целевой архитектуры, используйте аргумент:
TARGET_OUT=<your_build_dir>