Android Jni开发之Android Studio中使用Android.mk

最近将以前的eclipse项目迁移到android studio上,开发的程序动态库的部分比较复杂,能不能直接在studio编译原来的jni呢?答案是肯定的,只需要配置一下就可以了。

第一步,设置当前的ndk路径

                 Android Jni开发之Android Studio中使用Android.mk_第1张图片


第二步,将eclipse工程中的jni目录拷贝到src/main目录下;

第三步,在build.gradle的android中加入一下代码,
 sourceSets {
        main {
            jniLibs.srcDirs = ['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中的动态库进行打包。

参考:http://www.mamicode.com/info-detail-1163962.html

你可能感兴趣的:(Android——提高篇,android,jni开发基础)