默认情况下,存在src/main/jni文件夹时,gradle生成脚本会执行ndk编译生成操作,但是,编译生成方式并不是像以前那样用ndk-build去处理Android.mk Application.mk等进行c/c++代码的编译链接,而是在临时文件路径中重新生成了一份新的mk文件,并以此作为ndk编译项目。
如果我们想自己在jni目录下面建立Android.mk和Application.mk来进行编译,比如在so库中加入log打印功能,则需要在Android.mk中将log库编译到so文件,此时要怎么做呢?
首先在项目gradle文件的android{}中添加如下代码:
sourceSets { main { jni.srcDirs = [] //屏蔽gradle的jni生成过程 jniLibs.srcDir 'src/main/libs' } }
然后在gradle文件最底部添加一个ndk编译任务:
task ndkBuild(type: Exec) { commandLine 'ndk-build', '-C', file('src/main/jni').absolutePath } tasks.withType(JavaCompile) { compileTask -> compileTask.dependsOn ndkBuild }
注意:使用上述命令必须确定ndk的环境变量配置好了,也就是确定ndk的目录加到PATH中去了,否则该任务会执行失败。
在MAC中不能直接使用ndk-build,会找不到命令,即使已经在~/.bash_profile中将ndk目录加入到PATH中了也一样。需要使用绝对路径,如下:
commandLine '/User/xxx/xxx/ndk-build', '-C', file('src/main/jni').absolutePath
最后自己在jni目录下面建立Android.mk和Application.mk文件,直接点击AS上的运行就会先执行NDK编译的过程。