我的应用具有以下结构
Android
|
|-> app
| |
| |-> build [1]
| |-> src
| | |-> main
| | | |-> assets
| | | |-> java
| | | |-> jni
| | | | |-> Android.mk
| | | | |-> Application.mk
| | | |
| | | |-> jniLibs
| | | | |-> armeabi
| | | | |-> armeabi-v7a
| | | |
| | | |-> res
| | | |-> AndroidManifest.xml
|
|-> build [2]
我正在linux机器中使用.so
命令构建我的ndk-build
库。我用它像:
<my_ndk_path>/ndk-build -C <my_project_path>/Android/app/src/main/
构建过程正常,输出文件没有错误。
我的问题是结果文件没有“定向到正确的位置”
{:1}}生成于:
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
[1]或build
[2]。有没有办法通过将某些参数更改为build
文件或构建命令来实现这一目的?
修改
.mk
似乎不适用于NDK r6b
执行命令TARGET_OUT
警告,因为每个生成的文件都会显示以下内容。
ndk-build -C Android/app/src/main/ TARGET_OUT='Android/app/src/main/jniLibs/$(TARGET_ARCH_ABI)'
答案 0 :(得分:31)
您可以使用NDK_LIBS_OUT
更改libs输出,使用NDK_OUT
更改obj输出。
就像这样:ndk-build NDK_LIBS_OUT=./jniLibs NDK_OUT=./obj
答案 1 :(得分:5)
如果您需要构建所有可用的体系结构,请使用参数:
public enum ActiveStateGreenRed {
INACTIVE(false, STATE_COLOR.RED), //the only difference between enums
ACTIVE(true, STATE_COLOR.GREEN);
private final Boolean value;
private final STATE_COLOR color;
private ActiveStateGreenRed(Boolean value, STATE_COLOR color) {
this.value = value;
this.color = color;
}
public Boolean toValue() {
return value;
}
public STATE_COLOR toColor() {
return color;
}
}
如果只有一个目标架构就足够了,那么使用参数:
TARGET_OUT='<your_build_dir>/$(TARGET_ARCH_ABI)'
答案 2 :(得分:1)
我如何解决它。不是很优雅,但至少它有效。
因为我的构建机制非常复杂,所以我也有一些自定义的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,所以我把它保留原样。
答案 3 :(得分:0)
指定输出位置的更好,更简单的方法是链接Gradle to your native library。
之后,在buildStagingDirectory
块中使用ndkBuild
选项来指定输出位置:
android {
externalNativeBuild {
ndkBuild {
// Tells Gradle to put outputs from external native
// builds in the path specified below.
buildStagingDirectory "src/main/libs"
}
}
}
然后仅Sync Gradle
并完成构建。
答案 4 :(得分:0)
最简单的方法是 linking Android.mk 文件到 Gradle,如下所示:
android {
...
externalNativeBuild {
ndkBuild {
path file('src/main/jni/Android.mk')
}
}
}
然后只需点击立即同步并构建项目