Изменение местоположений вывода 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>