现在Android Studio已经是1.x版本了,其功能也是越来越完善,个人感觉AS还是蛮好用的,现在也是越来越多的公司转向使用AS了,使用方便是一个因素,Google官方不在支持eclipse也是一个因素,不管怎么样吧,反正就是要转向使用AS了,正好,前段时间,我所在的公司也要转向AS。折腾了一段时间后,想想还是写下这篇文章,分享一下在eclipse转AS时,NDK编译的问题。
gradle是多平台的编译语言,不知道为啥,在android上对ndk的支持一直都不太好,虽然现在简单的工程是可以正常编译了,但是如果NDK部分比较复杂的话,那就头痛了,至少,目前我发现使用gradle构建是没有办法编译静态库的。也可能是官方的文档我没有看的太详细,如果有谁知道如何使用gradle编译NDK的静态库,烦请告知,谢谢。
正好,我所开发的程序动态库的部分比较复杂,多个需求gradle是无法满足的,刚开始的时候没有什么头绪,到处找解决方法,有找到几种方法,对比了一下,发现有一种方法基本上是无缝对接,也没有什么复杂的操作,所以就用它了,现在把方法贴出来,给有需要的人,避免走弯路。
- local.properties中增加ndk.dir,设置ndk的路径
- eclipse工程中的jni目录拷贝到src/main目录下
- android{}中增加sourceSets.main.jni.srcDirs = [] 和sourceSets.main.jniLibs.srcDir ‘src/main/libs‘
- build.gradle中增加如下代码
tasks.withType(JavaCompile) { compileTask -> compileTask.dependsOn ndkBuild } task ndkBuild(type: Exec) { workingDir file(‘src/main/jni‘) commandLine getNdkBuildCmd() } task cleanNative(type: Exec){ workingDir file(‘src/main/jni‘) commandLine getNdkBuildCmd(), ‘clean‘ } clean.dependsOn cleanNative def getNdkDir() { if (System.env.ANDROID_NDK_ROOT != null) return System.env.ANDROID_NDK_ROOT Properties properties = new Properties() properties.load(project.rootProject.file(‘local.properties‘).newDataInputStream()) def ndkdir = properties.getProperty(‘ndk.dir‘, null) if (ndkdir == null) throw new GradleException("NDK location not found. Define location with ndk.dir in the local.properties file or with an ANDROID_NDK_ROOT environment variable.") return ndkdir } def getNdkBuildCmd() { def ndkbuild = getNdkDir() + "/ndk-build" ndkbuild += ".cmd" return ndkbuild }
就这么简单,搞定。加入这些任务之后,编译流程变成了,clean操作之前会先执行ndk-build clean任务,编译动作之前会先执行ndk-build任务,这样就确保了编译执行gradle clean的时候回执行ndk-build clean操作,在编译开始之前执行ndk-build操作,确保所有的动态库都已经编译出来,而且在目录src/main/libs中,然后在编译apk的时候,直接使用src/main/libs中的动态库进行打包。
最后执行一下gradle clean build,日志中我们可以看到ndk-build clean和ndk-build命令都有运行,out目录下生成的apk中也有相应的动态库。
2015.12.28
------End------