更改ndk-build输出位置

mad*_*mad 17 android android-gradle-plugin ndk-build

我的应用程序具有以下结构

Android
|
|-> app
|    |
|    |-> build [1]
|    |-> src
|    |    |-> main
|    |    |     |-> assets
|    |    |     |-> java
|    |    |     |-> jni 
|    |    |     |     |-> Android.mk
|    |    |     |     |-> Application.mk
|    |    |     |
|    |    |     |-> jniLibs
|    |    |     |      |-> armeabi
|    |    |     |      |-> armeabi-v7a
|    |    |     |
|    |    |     |-> res
|    |    |     |-> AndroidManifest.xml
|
|-> build [2]
Run Code Online (Sandbox Code Playgroud)

我在linux机器上.sondk-build命令构建我的库.我用它像:

<my_ndk_path>/ndk-build -C <my_project_path>/Android/app/src/main/
Run Code Online (Sandbox Code Playgroud)

构建过程工作正常,输出文件生成没有错误.

我的问题是结果文件没有"指向正确的位置"

libs在生成:

.app/src/main/libs/armeabi-v7a/libMyGeneratedLibrary.so
.app/src/main/libs/armeabi/libMyGeneratedLibrary.so
Run Code Online (Sandbox Code Playgroud)

以及以下obj文件:

.app/src/main/obj/local/armeabi-v7a/libMyGeneratedLibrary.so
.app/src/main/obj/local/armeabi/libMyGeneratedLibrary.so
Run Code Online (Sandbox Code Playgroud)

我想在不同的位置产生输出:

  1. libsjniLibs.即../app/src/main/jniLibs/armeabi*
  2. obj构建一个文件夹下.即.build[1]或build[2].

有没有可能通过将某些参数更改为.mk文件或构建命令来实现此目的?


编辑

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'
Run Code Online (Sandbox Code Playgroud)

小智 32

您可以使用NDK_LIBS_OUT更改libs输出和NDK_OUT更改obj输出.像这样 :ndk-build NDK_LIBS_OUT=./jniLibs NDK_OUT=./obj

  • 应该在Android.mk或Application.mk中添加NDK_LIBS_OUT的位置? (7认同)
  • 修订版7c中增加了"NDK_OUT"; 修订版9中添加了`NDK_LIBS_OUT`. (2认同)
  • 应将NDK_LIBS_OUT作为参数添加到ndk-build调用中 (2认同)
  • 那么如何向 ndk-build 调用添加参数呢?Gradle **3.2.1** 不断告诉我“arguments”无效。 (2认同)

小智 5

如果您需要构建所有可用的体系结构,请使用参数:

    TARGET_OUT='<your_build_dir>/$(TARGET_ARCH_ABI)'
Run Code Online (Sandbox Code Playgroud)

如果只有一个目标架构就足够了,那么使用参数:

    TARGET_OUT=<your_build_dir>
Run Code Online (Sandbox Code Playgroud)


mad*_*mad 2

编辑(对于使用较新 NDK 版本涉及此主题的任何人):

  • 用于NDK_LIBS_OUT更改库输出(需要 NDK r9 及更高版本)
  • 用于NDK_OUT更改 obj 输出(需要 NDK r7c 及更高版本)

构建命令是:

ndk-build NDK_LIBS_OUT=./jniLibs NDK_OUT=./obj
Run Code Online (Sandbox Code Playgroud)

先前的答案(适用于任何情况):

我怎么解决。不是很优雅,但至少它有效。

因为我的构建机制非常复杂,所以我也有几个自定义的 gradle 任务和脚本,所以构建的单个命令对我来说并不重要。

所以我保持构建命令不变

<my_ndk_path>/ndk-build -C <my_project_path>/Android/app/src/main/
Run Code Online (Sandbox Code Playgroud)

添加文件夹创建(-p 如果存在则不会生成错误)

mkdir -p <my_project_path>/Android/app/src/main/jniLibs/
Run Code Online (Sandbox Code Playgroud)

然后,我使用同步命令将 .so 文件移动到最终位置。

rsync -avh --remove-source-files                        \
      <my_project_path>/Android/app/src/main/libs/*     \
      <my_project_path>/Android/app/src/main/jniLibs/
Run Code Online (Sandbox Code Playgroud)

您可以对该obj文件夹执行类似的操作。我刚刚修改了我的 .gitignore,所以我保持原样。