Android Studio1.4.x JNI開發基礎-基本環境配置

KingsLanding發表於2015-11-18

  從Eclipse時代到Android Studio普及,開發工具越來越好用。早些時候還需要安裝Cygwin工具,從Android Studio1.3以後,在Android 環境開發JNI程式搭建開發環境變得相對簡單。這裡就來介紹一下急於Android Studio如何進行jni開發。

  首先準備基本工具,Android Studio (>=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的形式和上面的也不一樣為以下的形式:

          
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程式設計的及一些基本知識,希望對大家有幫助。

 

相關文章