关闭

[置顶] Android Studio1.4.x JNI开发基础-基本环境配置

标签: androidandroid studiojniandroid配置jni编译
142人阅读 评论(0) 收藏 举报
分类:

<span style="font-family: 'Microsoft YaHei'; line-height: 1.8; background-color: rgb(255, 255, 255);">从Eclipse时代到Android Studio普及,开发工具越来越好用。早些时候还需要安装Cygwin工具,从Android Studio1.3以后,在Android 环境开发JNI程序搭建开发环境变得相对简单。这里就来介绍一下急于Android Studio如何进行jni开发。</span>

  首先准备基本工具,(Android Studio 1.4.1下载) (>=1.3.x), NDK(ndk-r10-e)。打开Android Studio 建立一个空工程,关联上NDK,操作步骤方式如下图:



设置好NDK之后,开始设置gradle,设置gradle主要需要设置三个地方,设置好之后就可以直接编写和编译JNI代码了,不需要像以前一样编写Makefile,相当方便。但是设置gradle也是需要比较小心的,由于当前NDK还处于Experimental 阶段,更新不断,经常会爆出各种奇怪的错误,因此也要特别留心。好了废话不多说,下面来介绍设置gradle的三个主要步骤。

  首先 设置TopLevel gradle,也就是Project gradle,这里比较简单,在dependencies中设置:classpath 'com.android.tools.build:gradle-experimental:0.2.0' ,注意这里要把之前的类似classpath 'com.android.tools.build:gradle:1.3.0' 注释掉。还要多提一句的是,这里设置的是gradle-experimental:0.2.0,后面对应设置gradle wrapper的时候要对应gradle2.5-all 版本,这里先说到这里。

  接着 设置 Module gradle,这一步是比较麻烦的。由于我们在创建工程的时候自动生成的这个gradle文件内容比较多,而且如果要使用NDK的话这个gradle变化比较大,这里直接贴出需要使用NDK的gradle,然后来进行说明。

apply plugin: 'com.android.model.application'
 
model {
    android {
        compileSdkVersion = 23
        buildToolsVersion = "23.0.2"
 
        defaultConfig.with {
            applicationId = "com.zyp.ndktest"
            minSdkVersion.apiLevel  = 19  // Unable to load class com.android.build.gradle.managed.ProductFlavor_Impl
            targetSdkVersion.apiLevel = 23
            versionCode = 1
            versionName = "1.0"
        }
 
    }
    android.buildTypes {
        release {
            minifyEnabled = false
            proguardFiles += file('proguard-rules.pro')
        }
    }
 
 
    compileOptions.with {
        sourceCompatibility = JavaVersion.VERSION_1_7
        targetCompatibility = JavaVersion.VERSION_1_7
    }
    android.ndk {
        moduleName = "NdkSample"
        cppFlags += "-std=c++11"
        cppFlags += "-fexceptions"
        cppFlags += "-I${file("src/main/jni//include")}".toString()
        ldLibs += ["android", "log"]
        stl = "gnustl_shared"
    }
 
    android.productFlavors {
        create("arm7") {
            ndk.abiFilters.add("armeabi-v7a")
        }
        create("arm8") {
            ndk.abiFilters.add("arm64-v8a")
        }
 
    }
}
 
 
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:23.1.0'
}


和自动生成的gradle相比,首先是 apply plugin: 'com.android.application' 变成了 apply plugin: 'com.android.model.application'下面的配置也需要包装在model{}中。

  这个gradle的配置有几点需要注意的:

  1. 所有值的设置都要写成 xxx = yyyy的形式,比如: applicationId = "com.zyp.ndktest" (自动生成的gradle 则可能是: applicationId = "com.zyp.ndktest"  ),否则会爆这种错误:Error:Cause: org.gradle.api.internal.ExtensibleDynamicObject, 当出现此类错误,检查是否都用了 “=”的方式。


  2. buildTypes 需要从android{} 中取出来,写成android.buildTypes{}的形式,否则会出现这种错误:Error:Unable to load class 'org.gradle.nativeplatform.internal.DefaultBuildType_Decorated'.  

  

   此外,自动生成的buildTypes的形式和上面的也不一样为以下的形式:

<span style="white-space:pre">	</span>release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }


需要改成上面文件中的格式,否则会报这种错误:Error:No signature of method: org.gradle.model.ModelMap.minifyEnabled() is applicable for argument types: (java.lang.Boolean) values: [false]     

  3. defaultConfig{} 需要写成defaultConfig.with{} 的形式,否则会报这种错误:Error:Cause: com.android.build.gradle.managed.AndroidConfig_Impl

  4. 在defaultConfig.with{} 中 需要写成 

    minSdkVersion.apiLevel  = 19  
    targetSdkVersion.apiLevel = 23

    也就是比自动生成的多 .apiLevel ,否则会报这种错误:Unable to load class com.android.build.gradle.managed.ProductFlavor_Impl

  5. 增加compileOptions.with{} 需要选择JavaVersion.VERSION_1_7,否则会报这种错误:Bad class file magic or version

  6. 最后一点,在gradleWrapper中使用的是2.5,则android.ndk {} 中类似cppFlags 的添加使用 += 的方式,否则需要使用 .add的方式

  以上可能遇到的问题我这里帮大家罗列出来,具体的请参考Google的文档,只不过这个文档需要FQ。

  最后设置gradle wrapper就好了,将左边的工程视图调整到Project,在gradle->wrapper->grale-wrapper.properties文件的最后设置:distributionUrl=https\://services.gradle.org/distributions/gradle-2.5-all.zip,注意这里如果在Project gradle中设置的是gradle-experimental:0.2.0,则这里选择gradle-2.5-all,如果是gradle-experimental:0.4.0,需要设置gradle-2.8-all。

  gradle设置完成之后就可以创建jni文件夹,然后编写Native代码了,创建好jni后一个工程的基本结构见下图:


在JNI中创建.cpp/.c文件即可。本文先写到这里,接下来会介绍基本的jni实例和jni编程的及一些基本知识,希望对大家有帮助。



3
2

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:225次
    • 积分:5
    • 等级:
    • 排名:千里之外
    • 原创:0篇
    • 转载:2篇
    • 译文:0篇
    • 评论:0条
    文章存档