詳解如何使用Android Studio 進(jìn)行NDK開(kāi)發(fā)和調(diào)試
盡管Android Studio已經(jīng)越來(lái)越流行了,但很多人還是習(xí)慣于Eclipse或源碼環(huán)境下開(kāi)發(fā)JNI應(yīng)用。個(gè)人認(rèn)為使用Android Studio作NDK開(kāi)發(fā)是必然趨勢(shì),所以本文將簡(jiǎn)單介紹如何在Android Studio上實(shí)現(xiàn)NDK開(kāi)發(fā)。
簡(jiǎn)介
JNI
JNI 是Java Native Inteface的縮寫(xiě),是Java中定義的一種用于連接Java和C/C++接口的一種實(shí)現(xiàn)方式。
NDK
NDK 是 Native Developmentit的縮寫(xiě),是Google在Android開(kāi)發(fā)中提供的一套用于快速創(chuàng)建native工程的一個(gè)工具。
使用這個(gè)工具可以很方便的編寫(xiě)和調(diào)試JNI的代碼。
NDK可從官網(wǎng)或jb51.net下載。
Gradle
Gradle 是一個(gè)基于Apache Ant和Apache Maven概念的項(xiàng)目自動(dòng)化建構(gòu)工具。它使用一種基于Groovy的特定領(lǐng)域語(yǔ)言(DSL)來(lái)聲明項(xiàng)目設(shè)置。
以往Android NDK開(kāi)發(fā)需要在Eclipse或源碼環(huán)境下,建立并配置Android.mk和Application.mk,且還要通過(guò)java命令生成.h頭文件,才能編譯生成so庫(kù)。但在Android Studio中這些步驟都不需要,因?yàn)镚radle足夠強(qiáng)大,只需配置Gradle即可編譯生成so庫(kù)。
gradle-experimental插件
在2015年5月的Google I/O大會(huì)上, Google宣布Android Studio開(kāi)始支持NDK開(kāi)發(fā),通過(guò)和JetBrains的合作,將Clion整合進(jìn)了Android Studio 1.3,并免費(fèi)支持NDK C++開(kāi)發(fā)。
同年7月,在Android Studio 1.3版本上添加了gradle-experimental插件,該插件支持NDK開(kāi)發(fā)和調(diào)試,且?guī)в写a不全和重構(gòu)等高級(jí)功能。
CAVEAT: Note that this plugin is a preview of the plugin for feedback on performance and NDK integration. The Gradle API for the new component model is not final, which means each plugin will only work with a specific version of Gradle.
Additionally, the DSL may also change.
目前這個(gè)插件是預(yù)覽插件,并不是正式的。意味著插件只能運(yùn)行在特定的Gradle版本上。并且DSL(領(lǐng)域特定語(yǔ)言)也要改變。
使用Experimental插件進(jìn)行NDK開(kāi)發(fā)
使用Experimental插件的必要條件
1、Gradle-2.5或更高版本
2、Android Studio 1.3 RC1或更高版本
3、Android NDK r10e 或更高版本
4、Build Tools 19.0.0 或更高版本
每個(gè)版本的experimental插件需要特定的Gradle版本
Plugin Version | Gradle Version |
---|---|
0.1.0 | 2.5 |
0.2.0 | 2.5 |
0.3.0-alpha3 | 2.6 |
0.4.0 | 2.8 |
0.6.0-alpha1 | 2.8 |
0.6.0-alpha5 | 2.10 |
0.7.0-alpha1 | 2.10 |
NDK開(kāi)發(fā)步驟
1、新建一個(gè)Android標(biāo)準(zhǔn)工程
2、按F4打開(kāi)工程配置
3、使用experimental插件需要對(duì)以下三個(gè)文件做修改:
./build.gradle ./app/build.gradle ./gradle/wrapper/gradle-wrapper.properties
./gradle/wrapper/gradle-wrapper.properties
將distributionUrl改用gradle-2.10版本
distributionUrl=https\\://services.gradle.org/distributions/gradle-2.10-all.zip
./build.gradle
使用com.android.tools.build:gradle-experimental
代替 com.android.tools.build:gradle
buildscript { repositories { jcenter() } dependencies { //classpath 'com.android.tools.build:gradle:2.0.0' classpath "com.android.tools.build:gradle-experimental:0.7.0-alpha4" // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } }
./app/build.gradle
這部分改動(dòng)比較大,修改及注釋如下:
// 用com.android.model.application 代替 com.android.application apply plugin: 'com.android.model.application' // 將原來(lái)的配置用 model{}包起來(lái) model { android { // 取值必須使用 “=” 形式 // 否則會(huì)報(bào) “Error:Cause: org.gradle.api.internal.ExtensibleDynamicObject” 錯(cuò)誤 compileSdkVersion = 23 buildToolsVersion = '23.0.2' defaultConfig { // 取值必須使用 “=” 形式 applicationId = "com.connorlin.jnitest" //這里要注意是 xxSdkVersion.apiLevel // 否則會(huì)報(bào) “Unable to load class com.android.build.gradle.managed.ProductFlavor_Impl”錯(cuò)誤 minSdkVersion.apiLevel = 15 targetSdkVersion.apiLevel = 23 versionCode = 1 versionName = "1.0" } // 配置NDK ndk { // 生成so的名字,是必須的 moduleName ="JNITest" toolchain = 'clang' CFlags.add('-std=c99') // 添加依賴庫(kù) ldLibs.addAll(['android','OpenSLES', 'log']) // 生成不同abi體系的so庫(kù) abiFilters.addAll(['armeabi', 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64', 'mips', 'mips64']) } buildTypes { release { minifyEnabled = false // 這里注意:使用proguardFiles.add()方法 proguardFiles.add(file('proguard-rules.txt')) } } } }
4、在Java文件(這里以JNIActivity為例)中添加代碼
static { System.loadLibrary("JNITest"); } public native String testJni();
此時(shí),native方法標(biāo)紅,提示如下:
在testJni()方法上按快捷鍵Alt + Enter,出現(xiàn)如下提示
按回車(chē),會(huì)自動(dòng)在main目錄下生成jni文件夾,內(nèi)含JniDemo.c:
#include <jni.h> JNIEXPORT jstring JNICALL Java_com_connorlin_jnitest_MainActivity_testJni(JNIEnv *env, jobject instance) { // TODO return (*env)->NewStringUTF(env, "returnValue"); }
你會(huì)發(fā)現(xiàn),Android Studio已經(jīng)為我們自動(dòng)生成JNI方法了,你只需要再寫(xiě)實(shí)現(xiàn)就可以了。
至此,最簡(jiǎn)單的NDK開(kāi)發(fā)配置完畢。
其他配置,請(qǐng)參考官方文檔,Demo可以參考官方Demo
換種方式進(jìn)行NDK開(kāi)發(fā)
既然預(yù)覽版com.android.tools.build:gradle-experimental支持NDK,
那么正式版com.android.tools.build:gradle 是否也可以實(shí)現(xiàn)NDK開(kāi)發(fā)呢?
經(jīng)過(guò)實(shí)驗(yàn),答案是可以的!
步驟
1、新建一個(gè)Android標(biāo)準(zhǔn)工程,并在工程設(shè)置中配置NDK路徑。
2、打開(kāi) app level 的 build.gradle, 配置NDK
ndk { moduleName "NdkJniDemo" //生成的so名字 abiFilters "armeabi", "armeabi-v7a", "x86" //輸出指定三種abi體系結(jié)構(gòu)下的so庫(kù),可忽略 }
然后點(diǎn)擊右上角Sync Now, 會(huì)有如下錯(cuò)誤提示:
按提示,在 gradl.properties 文件里加上android.useDeprecatedNdk=true即可。
3、在Java文件(這里以JNIActivity為例)中添加代碼
static { System.loadLibrary("JNITest"); } public native String testJni();
接著在testJni()方法上按快捷鍵Alt + Enter并回車(chē),
同樣,會(huì)自動(dòng)在main目錄下生成jni文件夾,內(nèi)含JniDemo.c:
#include <jni.h>
但是,你會(huì)發(fā)現(xiàn)并不會(huì)自動(dòng)生成JNI方法,這是因?yàn)槭褂胑xperimental插件才會(huì)自動(dòng)生成代碼。
那自動(dòng)生成代碼該如何實(shí)現(xiàn)呢?
方法依然是使用gradle-experimental插件,但是不同的是,在app level的build.gradle中添加com.android.tools.build:gradle-experimental依賴。
4、在./app/build.gradle中添加gradle-experimental依賴
dependencies { compile 'com.android.tools.build:gradle-experimental:0.7.0' }
再次在testJni()方法上按快捷鍵Alt + Enter并回車(chē)
#include <jni.h> JNIEXPORT jstring JNICALL Java_com_connorlin_jnitest_MainActivity_testJni(JNIEnv *env, jobject instance) { // TODO return (*env)->NewStringUTF(env, "returnValue"); }
你會(huì)發(fā)現(xiàn)成功自動(dòng)生成JNI方法了。
副作用
這種方式有個(gè)副作用是 Run app 時(shí)可能會(huì)報(bào)錯(cuò):
此時(shí),只要將gradle-experimental依賴注釋掉即可正常運(yùn)行,同時(shí)會(huì)保持自動(dòng)生成代碼的功能,直到關(guān)閉工程。
這樣我們?cè)谛枰詣?dòng)生成代碼的時(shí)候,將gradle-experimental依賴再次打開(kāi)即可。
NDK調(diào)試
默認(rèn)情況下是不支持NDK調(diào)試的,但要支持NDK調(diào)試也很簡(jiǎn)單,只要做些簡(jiǎn)單配置即可。
1、打開(kāi)JNI調(diào)試
2、配置Android Native - Debugger
3、下載LLDB 2.0
首次底部會(huì)報(bào)錯(cuò)
點(diǎn)擊 Fix,提示下載LLDB 2.0,照做,下載安裝即可。
4、完成NDK調(diào)試配置,可以正常調(diào)試了。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- android studio與手機(jī)連接調(diào)試步驟詳解
- Android Studio下無(wú)線調(diào)試的方法
- Android Studio使用USB真機(jī)調(diào)試詳解
- Android Studio調(diào)試功能使用匯總
- 詳解如何使用VisualStudio高效開(kāi)發(fā)調(diào)試AndroidNDK
- 詳解AndroidStudio3.0開(kāi)發(fā)調(diào)試安卓NDK的C++代碼
- SQLiteStudio優(yōu)雅調(diào)試Android手機(jī)數(shù)據(jù)庫(kù)Sqlite(推薦)
- 詳解Android Studio正式簽名進(jìn)行調(diào)試的實(shí)現(xiàn)步驟
- 簡(jiǎn)單實(shí)用的Android studio 調(diào)試技巧
- Android studio 連接手機(jī)調(diào)試操作步驟
相關(guān)文章
flutter實(shí)現(xiàn)appbar下選項(xiàng)卡切換
這篇文章主要為大家詳細(xì)介紹了flutter實(shí)現(xiàn)appbar下選項(xiàng)卡切換,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07掃二維碼下載apk并統(tǒng)計(jì)被掃描次數(shù)
本文主要對(duì)實(shí)現(xiàn)用戶掃描一個(gè)二維碼就能下載APP,并統(tǒng)計(jì)被掃描次數(shù)的方法進(jìn)行詳細(xì)介紹,具有一定的參考作用,下面跟著小編一起來(lái)看下吧2017-01-01Android實(shí)現(xiàn)支持進(jìn)度條顯示的短信備份工具類(lèi)
這篇文章主要介紹了Android實(shí)現(xiàn)支持進(jìn)度條顯示的短信備份工具類(lèi),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-03-03Android開(kāi)發(fā)一行代碼解決安卓重復(fù)點(diǎn)擊
這篇文章主要為大家介紹了Android開(kāi)發(fā)一行代碼解決安卓重復(fù)點(diǎn)擊,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06Android應(yīng)用中使用XmlSerializer序列化XML數(shù)據(jù)的教程
這篇文章主要介紹了Android應(yīng)用中使用XmlSerializer序列化XML數(shù)據(jù)的教程,XmlSerializer序列化XML同時(shí)也是將數(shù)據(jù)寫(xiě)為XML格式的基本方法,需要的朋友可以參考下2016-04-04android4.0屏蔽HOME鍵的簡(jiǎn)單實(shí)現(xiàn)
這篇文章主要介紹了android4.0屏蔽HOME鍵的簡(jiǎn)單實(shí)現(xiàn),需要的朋友可以參考下2014-02-02Android 三行代碼實(shí)現(xiàn)高斯模糊效果
這篇文章主要介紹了Android 三行代碼實(shí)現(xiàn)高斯模糊效果,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09Android模擬實(shí)現(xiàn)網(wǎng)易新聞客戶端
這篇文章主要為大家詳細(xì)介紹了Android模擬實(shí)現(xiàn)網(wǎng)易新聞客戶端,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05