Android studio使用ndk-build进行编译

在studio2.3 中创建一个ndk工程,该工程默认是通过cmake进行编译,我们修改为使用熟悉的ndk-build来编译, 这样可以编写自己的makefile。

方法1: (Android.mk & Gradle)

1 在studio中创建jni目录 app/src/main/jni

    app->右键->new->Folder->Jni Folder     
    选择 change folder location , 对应src/main/jni       

2 在jni目录编写Android.mk 和 Application.mk

3 编辑 app/build.gradle

 android{
    externalNativeBuild {
        ndkBuild {
            path'src/main/jni/Android.mk'
        }
    }
    sourceSets { main { jni.srcDirs = ['src/main/jni', 'src/main/jni/'] } }
}

该方法Application.mk不再使用,需要把内容对应到 build.gradle:

defaultConfig {
        externalNativeBuild {
            ndkBuild {                        
              ...
              abiFilters "armeabi-v7a", "armeabi"
            } 
        }
}

更详细内容参考Google官方文档:
https://sites.google.com/a/android.com/tools/tech-docs/external-c-builds#TOC-Release-History

方法2 :(Android.mk & Application.mk)

1 手动创建jni目录 app/src/main/jni

2 在jni目录编写Android.mk 和 Application.mk

3 编辑 app/build.gradle.

1). 删除ndk section
 ndk{} 
2). 增加import org.apache.tools.ant.taskdefs.condition.Os 
import org.apache.tools.ant.taskdefs.condition.Os

apply plugin: 'com.android.application'
android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"
    defaultConfig {
    applicationId "com.packtpub.store"
    minSdkVersion 14
    targetSdkVersion 21
    versionCode 1
    versionName "1.0"
}
buildTypes {
    release {
    minifyEnabled false
    proguardFiles getDefaultProguardFile('proguard-android.txt'),
     'proguard-rules.pro'
    }
}
3) 增加sourceSets.main section
sourceSets.main {
    jniLibs.srcDir 'src/main/libs'
    jni.srcDirs = []
}
jniLibs.srcDir, 定义gradle去什么的地方找产生的库文件
jni.srcDirs,    定义静止gradle编译 native code



4) 最后创建新的Gradle 任务 ndkbuild,定义src/main 为编译路径
task ndkBuild(type: Exec) {
    if (Os.isFamily(Os.FAMILY_WINDOWS)) {
        commandLine 'ndk-build.cmd', '-C', file('src/main').absolutePath
    } else {
        commandLine 'ndk-build', '-C', file('src/main').absolutePath
    }
}
tasks.withType(JavaCompile) {
    compileTask -> compileTask.dependsOn ndkBuild
}

修改后的build.gradle:

import org.apache.tools.ant.taskdefs.condition.Os

apply plugin: 'com.android.application'

android {
    compileSdkVersion 26
    buildToolsVersion "26.0.1"
    defaultConfig {
        applicationId "com.example.hello"
        minSdkVersion 14
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile
            ('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    sourceSets.main {
        jniLibs.srcDir 'src/main/libs'
        jni.srcDirs = []
    }  
    task ndkBuild(type: Exec) {
        if (Os.isFamily(Os.FAMILY_WINDOWS)) {
            commandLine 'ndk-build.cmd', '-C', file('src/main').absolutePath
        } else {
            commandLine 'ndk-build', '-C', file('src/main').absolutePath
        }
    }
    tasks.withType(JavaCompile) {
        compileTask -> compileTask.dependsOn ndkBuild
    }   
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:
    espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 
        'support-annotations'
    })
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    testCompile 'junit:junit:4.12'
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值