更改 ndk-build 输出位置

Change ndk-build output locations

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

Android
|
|-> app
|    |
|    |-> build [1]
|    |-> src
|    |    |-> main
|    |    |     |-> assets
|    |    |     |-> java
|    |    |     |-> jni 
|    |    |     |     |-> Android.mk
|    |    |     |     |-> Application.mk
|    |    |     |
|    |    |     |-> jniLibs
|    |    |     |      |-> armeabi
|    |    |     |      |-> armeabi-v7a
|    |    |     |
|    |    |     |-> res
|    |    |     |-> AndroidManifest.xml
|
|-> build [2]

我正在 linux 机器上使用 ndk-build 命令构建我的 .so 库。我像这样使用它:

<my_ndk_path>/ndk-build -C <my_project_path>/Android/app/src/main/

构建过程运行良好,生成的输出文件没有错误。

我的问题是结果文件不是"directed to the proper position"

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

我希望在不同位置生成输出:

  1. jniLibs 处的 libs。 IE。 ./app/src/main/<em>jniLibs</em>/armeabi*
  2. 其中一个构建文件夹下的 obj。 IE。 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'

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

如果您需要为所有可用架构构建,请使用参数:

    TARGET_OUT='<your_build_dir>/$(TARGET_ARCH_ABI)'

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

    TARGET_OUT=<your_build_dir>

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

  • 使用NDK_LIBS_OUT更改库输出(需要NDK r9及以上版本)
  • 使用NDK_OUT改变obj输出(需要NDK r7c及以上版本)

构建命令是:

ndk-build NDK_LIBS_OUT=./jniLibs NDK_OUT=./obj

上一个回答(任何情况都适用):

我是怎么解决的。不是很优雅,但至少可以用。

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

所以我保持构建命令不变

<my_ndk_path>/ndk-build -C <my_project_path>/Android/app/src/main/

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

mkdir -p <my_project_path>/Android/app/src/main/jniLibs/

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

rsync -avh --remove-source-files                        \
      <my_project_path>/Android/app/src/main/libs/*     \
      <my_project_path>/Android/app/src/main/jniLibs/

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

指定输出位置的更好、更简单的方法是链接 Gradle to your native library。 之后,使用 ndkBuild 块中的 buildStagingDirectory 选项指定输出位置:

android {
    externalNativeBuild {
        ndkBuild {
            // Tells Gradle to put outputs from external native
            // builds in the path specified below.
            buildStagingDirectory  "src/main/libs"
        }
    }
}

然后 Sync Gradle 并构建,完成。

最简单的方法是linkingAndroid.mk文件到Gradle,像这样:

android {
    ...
    externalNativeBuild {
        ndkBuild {
            path file('src/main/jni/Android.mk')
        }
    }
}

然后只需单击 立即同步 并构建项目