Android NDK開發 環境配置(一) 之多重CPU的兼容性


今天我學習Android Studio當中的NDK,為什么要學習NDK呢,是因為領導給我提了一個BUG,這個BUG就是Android 多重CPU怎樣兼容性,我現在先說一下,Android Studio的NDK在哪里吧,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,然后來進行說明。

 

model {
    android {
        compileSdkVersion = 23
        buildToolsVersion ="23.0.2"
 
        defaultConfig.with {
            applicationId ="com.qihoo.test"
            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, 當出現此類錯誤,檢查是否都用了 “=”的方式。並且minSdkVersion.apiLevel和targetSdkVersion.apiLevel也需要修改

自動生成的:

 defaultConfig {
        applicationId "com.qihoo.test"
      minSdkVersion 14 targetSdkVersion 14
        multiDexEnabled true
    }

 

修改的:

   defaultConfig {
            applicationId = 'com.qihoo.test'
            minSdkVersion.apiLevel = 4 targetSdkVersion.apiLevel = 23
        }

 

 

  2. buildTypes 需要從android{} 中取出來,寫成android.buildTypes{}的形式,否則會出現這種錯誤:Error:Unable to load class 'org.gradle.nativeplatform.internal.DefaultBuildType_Decorated'.    

   此外,自動生成的buildTypes的形式和上面的也不一樣為以下的形式:

自動生成的:

release {
            minifyEnabledfalse
            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]   

正確的:

 release {
            minifyEnabled =false proguardFiles += file('proguard-rules.pro')
        }

 

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM