Android 更改ndk生成输出位置
我的应用程序具有以下结构Android 更改ndk生成输出位置,android,android-gradle-plugin,ndk-build,Android,Android Gradle Plugin,Ndk Build,我的应用程序具有以下结构 Android | |-> app | | | |-> build [1] | |-> src | | |-> main | | | |-> assets | | | |-> java | | | |-> 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/
而obj
文件位于:
.app/src/main/obj/local/armeabi-v7a/libMyGeneratedLibrary.so
.app/src/main/obj/local/armeabi/libMyGeneratedLibrary.so
我希望在不同的地点制作输出:
jniLibs
处的libs
。
例如,/app/src/main/jniLibs/armeabi*
obj
。即构建
[1]或构建
[2].mk
文件或build命令来实现这一点
编辑
TARGET\u OUT
在NDK r6b中似乎不起作用
执行命令ndk build-C Android/app/src/main/TARGET\u OUT='Android/app/src/main/jniLibs/$(TARGET\u ARCH\u 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>
TARGET\u OUT='/$(TARGET\u ARCH\u ABI)'
如果只有一个目标架构就足够了,那么使用参数:
TARGET_OUT='<your_build_dir>/$(TARGET_ARCH_ABI)'
TARGET_OUT=<your_build_dir>
TARGET\u OUT=
编辑(适用于使用较新NDK版本的人):
- 使用
更改LIBS输出(需要NDK r9及以上版本)NDK_LIBS_OUT
- 使用
更改obj输出(需要NDK r7c及以上)NDK\U OUT
ndk-build NDK_LIBS_OUT=./jniLibs NDK_OUT=./obj
之前的答案(适用于任何情况): 我如何解决它。不是很优雅,但至少它能工作 因为我的构建机制非常复杂,所以我也有一些定制的gradle任务和脚本,构建的单个命令对我来说并不重要 所以我保持了构建命令的原样
<my_ndk_path>/ndk-build -C <my_project_path>/Android/app/src/main/
/ndk build-C/Android/app/src/main/
在文件夹创建过程中添加一个(-p如果存在,则不生成错误)
mkdir-p/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/
rsync-avh——删除源文件\
/Android/app/src/main/libs/*\
/Android/app/src/main/jniLibs/
您可以对
obj
文件夹执行类似操作。我刚刚修改了.gitignore,所以我保留了它的原样。指定输出位置的更好、更简单的方法是链接。
之后,使用ndkBuild
块中的buildstagindirectory
选项指定输出位置:
android {
externalNativeBuild {
ndkBuild {
// Tells Gradle to put outputs from external native
// builds in the path specified below.
buildStagingDirectory "src/main/libs"
}
}
}
然后同步Gradle并构建,完成。最简单的方法是将Android.mk文件复制到Gradle,如下所示:
android {
...
externalNativeBuild {
ndkBuild {
path file('src/main/jni/Android.mk')
}
}
}
然后点击立即同步,然后构建项目这对我来说真的不起作用。看起来NDK忽略了这些。也许这是后来版本的一部分,因为我有一个相当旧的r6b版本。
NDK_OUT
是在第7c版中添加的NDK_LIBS_OUT
在第9版中添加。在Android.mk或Application.mk中,应该在哪里添加NDK_LIBS_OUT?NDK_LIBS_OUT应该添加为NDK build call的一个参数。那么如何向NDK build call添加一个参数呢?Gradle 3.2.1一直告诉我,参数
无效。这对我也不起作用,因为我需要的$(TARGET\u ARCH\u ABI)
没有任何效果,库是在jniLibs文件夹中生成的,而不是在armeabi
中生成的,armeabi-v7a
使用上述参数时,您是否可以复制并粘贴您的确切命令行?我很好奇,因为我在几个小时前成功地使用了它。另外,你的NDK版本是什么?遗憾的是,它是一个非常旧的r6b版本。我尝试了许多不同的方法,还尝试将TARGET\u OUT:=…
添加到应用程序.mk
中,当它通过且未失败时,我会收到我添加到原始帖子中的警告。指定外部本机生成输出目录的路径,以替换默认的/.cxx/
。我同意上面的官方解释可能令人困惑,但是这个目录包含中间构建文件(日志、对象等)。.so
文件通常进入/build
目录。请参阅。两个cmake
和ndkBuild
部分似乎都允许buildStagingDirectory
选项,谢谢!