1. gradle-ex
2. ndk开发包
3. 项目目录结构
4. lldb调试器
1. 一般来说gradle不是必需的,gradle也是可以进行ndk编译的,然而你需要在编译时使用更多(多于一个)c++编译选项时,以及让IDE可以使用lldb进行调试,或者是针对ndk开发和编译有更好的支持时,gradle-ex就是你所需要的。
gradle-ex的ex不是扩展而是experimental实验非正式。它对ndk相关的配置进行了增强,同时又语法不兼容gradle,并且在ndk相关以外的配置沿着的是gradle的语法。也就是gradle-ex并非完全全新,只对ndk相关进行改动,并且改动的地方与原来语法不兼容。gradle默认是废用ndk扩展的,需要手动修改开启支持。gradle对ndk的编译选项认为是cFlags,并且只能使用一个编译选项,而gradle-ex不再有cFlags,取代之的是cppFlags。gradle和gradle-ex对于ndk的配置的属性路径编排不一致,也就是gradle-ex对部分属性路径进行了重新的编排。gradle-ex中字符串和数组的赋值使用了新的语法。gradle和gradle-ex不对你的gradle脚本进行严格的语法检查,只会在gradle作业可错时报怨,你就自己慢慢去想到底哪里有问题吧。
使用gradle-ex,需要在Top-level build.gradle的buildscript.dependencies.classpath修改成com.andraoid.tools.build:gradle-experimental:0.7.0-alphal。
2. ndk开发包,包含了必要的交叉编译工具和平台导出的头文件和最小运行链接文件等。可以通过IDE配置选用Tools->System Settings->Android SDK->SDK Tools->NDK,让IDE自行更新下载。或者将离线压缩包解压到你的${ANDROID_SDK}目录下ndk-bundle子目录。
如果IDE未能正确识别NDK路径,可以利用任一个项目,对其local.properties文件进行NDK_PATH的配置,并且同步让IDE去执行配置适配。
3. gradle进行编译时依赖严格的目录结构。
使用ndk-build命令进行编译时,ndk-build需要搜索jni目录,如果没有jni目录,ndk-build就会以为没有需要编译的项目。
同样使用gradle或gradle-ex,它们也固定的搜索目录路径。
一般地在src目录下:
app/build/intermediates/binaries/debug/${HOST_ARCH}/lib jni项目需要生成的库文件。
app/build/intermediates/jniLibs/${HOST_ARCH}/debug 源代码jniLibs目录下的全部内容将会被复制到这里,第三方链接库。
app/build/intermediates/objectFiles 源代码base目录下的全部内容将会被复制到这里,本项目源代码生成的中间文件。
app/build/intermediates/transforms/mergeJniLibs/${HOST_ARCH}/.../lib 将jni项目生成的库文件,以及放在jniLibs备用并被需要链接上的库文件,合并目录。
也就是模拟器加载jni链接库的目录。
app/libs 导入jar包的目录
app/src/main/java java代码
app/src/main/java/jni native方法生成的c头文件
app/src/main/jni 所有c/c++源代码,以及第三方库的开发头文件
app/src/main/jniLibs 所有jni目录下代码所链接到的第三方库链接文件
4. lldb调用器,可以可以通过IDE配置选用Tools->System Settings->Android SDK->SDK Tools->lldb,让IDE自行更新下载。或者将离线压缩包解压到你的${ANDROID_SDK}目录下ndk-bundle子目录。
gradle-ex自动会建立起lldbserver远程调试连接,所以虽然使用了lldb调试器,但却是远程调试,使用的时候也有许多支持不好,比栈帧选用命令不起效,线程选用命令也不起效等。