androidstudio下NDK正确姿势

来源:互联网 发布:做seo需要什么技能 编辑:程序博客网 时间:2024/04/29 10:42

用androidstudio开发的小伙伴,应该知道自身的ndk自动编译就是鸡肋!
这里说2种方法:
1> 进入到工程jni目录运行ndk-build
如何快速复制jni路径

jni路径

右键Copy Path或者按快捷键Ctrl+Shift+C

cd /home/wangxiong/Documents/Github/libraries/blur/src/main/jni~/Soft/android-ndk-r10e/ndk-build

编译完成就会在libs生成各个平台的so文件

result

2> 第2种方式,脚本配置
首先要把as自动编译关掉

sourceSets.main {        jniLibs.srcDirs 'src/main/libs'        jni.srcDirs = [] // This prevents the auto generation of Android.mk}

看代码,这里借鉴了Facebook的Fresco图片框架的gradle相关配置写法
传送门:https://github.com/facebook/fresco/blob/master/imagepipeline/build.gradle
可以研究下脚本的相关写法

import org.apache.tools.ant.taskdefs.condition.Os//导入Os包,方便下面判断系统平台Linux \ windowsapply plugin: 'com.android.library'dependencies {    compile fileTree(dir: 'libs', include: ['*.jar'])    compile 'com.android.support:appcompat-v7:23.0.1'}def getNdkBuildName() {//NDK编译工具名称,区别Linux和windows    if (Os.isFamily(Os.FAMILY_WINDOWS)) {        return "ndk-build.cmd"    } else {        return "ndk-build"    }}def getNdkBuildFullPath() {//NDK全路径    File propFile = project.rootProject.file('local.properties')    if (!propFile.exists()) {        return getNdkBuildName()    }    Properties properties = new Properties()    properties.load(propFile.newDataInputStream())    def ndkCommand = properties.getProperty('ndk.command')    if (ndkCommand != null) {        return ndkCommand    }    def path = null    def ndkPath = properties.getProperty('ndk.path')    if (ndkPath != null) {        path = ndkPath    } else {        def ndkDir = properties.getProperty('ndk.dir')        if (ndkDir != null) {            path = ndkDir        }    }    if (path != null) {        if (!path.endsWith(File.separator)) {            path += File.separator        }        return path + getNdkBuildName()    } else {        // if none of above is provided, we assume ndk-build is already in $PATH        return getNdkBuildName()    }}android {    compileSdkVersion = 23    buildToolsVersion = "23.0.3"    defaultConfig {        minSdkVersion 15        targetSdkVersion 22        versionCode = 200        versionName = "2.0.0"    }    buildTypes {        release {            minifyEnabled = false            proguardFiles.add(file('proguard-rules.pro'))        }    }    sourceSets.main {        jni.srcDirs = []//关掉自动编译        jniLibs.srcDirs 'src/main/libs'    }// This prevents the auto generation of Android.mk}//编译任务注意type: Exectask hello_ndk_build(type: Exec) {    commandLine getNdkBuildFullPath(),            'NDK_APPLICATION_MK=Application.mk',            'NDK_OUT=' + temporaryDir,            "NDK_LIBS_OUT=" + file("src/main/libs").absolutePath,            '-C', file("src/main/jni").absolutePath,            '--jobs', Runtime.getRuntime().availableProcessors()}tasks.withType(JavaCompile) {    compileTask -> compileTask.dependsOn "hello_ndk_build"//与task任务名相同}task hello_ndk_clean(type: Exec) {    commandLine getNdkBuildFullPath(),            'clean',            '-C', file("src/main/jni").absolutePath}clean.dependsOn 'hello_ndk_clean'//clean依赖上面定义的任务

参数ps:
@NDK_PROJECT_PATH
指定NDK编译的代码路径为当前目录,如果不配置,则必须把工程代码放Android工程的jni目录下
@NDK_APP_APPLICATION_MK
指定NDK编译使用的application.mk文件
@clean
清除所有编译出来的临时文件和目标文件
@NDK_OUT
指定编译生成的文件的存放位置
@NDK_LIBS_OUT
编译后最终的lib目录

这里写图片描述

注意观察build目录下生成的一些文件,和编译配置时的关联!

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 宝宝脖子睡偏了怎么办 宝宝头歪向左边怎么办 一岁宝宝头歪怎么办 宝宝头往右边歪怎么办 八个月宝宝头歪怎么办 宝宝头往左边偏怎么办 11月婴儿歪脖子怎么办 婴儿头往左边偏怎么办 宝宝头网的高怎么办 宝宝头歪向一边怎么办 2岁宝宝头睡偏了怎么办 6岁儿童头有点歪怎么办 宝宝脖子有点偏左边歪怎么办 宝宝脖子偏了怎么办呢 斜颈导致的脸歪怎么办 斜颈手术后脸部还不对称怎么办 宝宝3个月斜颈怎么办 一岁八个月宝宝斜颈怎么办 四个月宝宝有点斜颈怎么办 一岁宝宝有点偏怎么办 6个月宝宝有点斜颈怎么办 四个月宝宝左侧胸锁乳突肌厚怎么办 脖子疼好几天了怎么办 有双下巴怎么办才能瘦掉 胃突然疼的厉害怎么办 手劳损痛的厉害怎么办 手臂扭到了很疼怎么办 寒湿导致肩膀痛怎么办 吃辣脖子肿了怎么办 脖子长了个肿瘤怎么办 一边背高一边低怎么办 生完孩子肩宽了怎么办 狗狗脖子上长囊肿怎么办 胸肋关节韧带疼怎么办 三岁宝宝有点驼背怎么办 20多岁有点驼背怎么办 五岁宝宝有点驼背怎么办 孕妇腰扭了很痛怎么办 怀孕了腰扭了疼怎么办 小龙芭比扭腰机开机没有声音怎么办 高中生训练数学计算的准确性怎么办