更改 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
我希望在不同位置生成输出:
jniLibs
处的 libs
。
IE。 ./app/src/main/<em>jniLibs</em>/armeabi*
- 其中一个构建文件夹下的
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')
}
}
}
然后只需单击 立即同步 并构建项目
我的应用程序具有以下结构
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
我希望在不同位置生成输出:
jniLibs
处的libs
。 IE。./app/src/main/<em>jniLibs</em>/armeabi*
- 其中一个构建文件夹下的
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')
}
}
}
然后只需单击 立即同步 并构建项目