android studio ndk 编译自定义MK文件

本列是最新版本的android studio 2.0 测试成功。
1、local.properties中添加ndk路径 如下:

ndk.dir=/Users/apple/Library/Android/sdk/ndk-bundle
sdk.dir=/Users/apple/Library/Android/sdk

2、gradle.properties 中添加 android.useDeprecatedNdk=true
3、修改 build.gradle
引入 import org.apache.tools.ant.taskdefs.condition.Os
在 android {} 中添加如下代码

sourceSets {
        main {
            jni.srcDirs=[] //禁止使用默认的ndk编译系统
            jniLibs.srcDirs 'src/main/libs' //so存放地方
        }
    }

    task ndkBuild(type: org.gradle.api.tasks.Exec) {
        workingDir file('src/main')
        commandLine getNdkBuildCmd() //执行ndk-build 命令
    }

    tasks.withType(JavaCompile) {
        compileTask -> compileTask.dependsOn ndkBuild
    }
    task cleanNative(type: Exec) {
        workingDir file('src/main')
        commandLine getNdkBuildCmd(), 'clean'
    }
    clean.dependsOn cleanNative

android{} 外面添加如下:

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())
       //从属性文件里得到ndk路径
    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"
   if (Os.isFamily(Os.FAMILY_WINDOWS))
       ndkbuild += ".cmd"
    return ndkbuild
}

4、整体 添加如下:

import org.apache.tools.ant.taskdefs.condition.Os
apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        applicationId "cody.com.jnidemo"
        minSdkVersion 18
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"

//        ndk { //这里用系统自带的mk文件编译,不需要些mk文件
//            moduleName "jnidemo"
//            ldLibs "log"
//
//        }

    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    //sourceSets { main { jni.srcDirs = ['src/main/jni', 'src/main/jni/', 'src/main/jniLibs'] } }
    sourceSets {
        main {
            jni.srcDirs=[]
            jniLibs.srcDirs 'src/main/libs'
        }
    }

    task ndkBuild(type: org.gradle.api.tasks.Exec) {
        workingDir file('src/main')
        commandLine getNdkBuildCmd()
    }

    tasks.withType(JavaCompile) {
        compileTask -> compileTask.dependsOn ndkBuild
    }
    task cleanNative(type: Exec) {
        workingDir file('src/main')
        commandLine getNdkBuildCmd(), 'clean'
    }
    clean.dependsOn cleanNative

}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.3.0'
}

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"
       if (Os.isFamily(Os.FAMILY_WINDOWS))
               ndkbuild += ".cmd"
    return ndkbuild
}

ndk编译出错如下错误处理,在相应mk文件加

warning: shared library text segment is not shareable
 error: treating warnings as errors

添加内容如下:

 LOCAL_DISABLE_FATAL_LINKER_WARNINGS := true
 LOCAL_LDFLAGS += -Wl,--no-warn-shared-textrel

方法二:简单一点的

apply plugin: 'com.android.application'

android {
    compileSdkVersion 22
    buildToolsVersion '22.0.0'

    defaultConfig {
        applicationId "cody.com.android5mediacodec"
        minSdkVersion 19
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
//        ndk {
//            moduleName "xiaoyao_live"//so文件的名称
//            ldLibs "log","z","m"
//            abiFilters "armeabi-v7a"
//        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }



    sourceSets {
        main{

//            jni.srcDirs = []
            jniLibs.srcDirs 'src/main/libs' //so存放地方
        }

    }

    task ndkBuild(type: Exec, description: 'Compile JNI source via NDK') {
        commandLine "/Users/apple/Library/Android/sdk/ndk-bundle/ndk-build",
                'NDK_PROJECT_PATH=build/intermediates/ndk',
                'NDK_LIBS_OUT=src/main/libs',
                'APP_BUILD_SCRIPT=src/main/jni/Android.mk',
                'NDK_APPLICATION_MK=src/main/jni/Application.mk'
    }
    tasks.withType(JavaCompile) {
        compileTask -> compileTask.dependsOn ndkBuild
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    //    compile 'com.android.support:appcompat-v7:23.3.0'
    compile 'com.android.support:appcompat-v7:22.1.0'
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值