本文已授權微信公眾號:鴻洋(hongyangAndroid)在微信公眾號平臺原創(chuàng)首發(fā)。
這一篇文章主要介紹在AndroidStudio環(huán)境如何搭建JNI開發(fā)環(huán)境勋锤,并通過一個helloword的方式了解進行JNI開發(fā)的步驟楔壤。
開發(fā)編譯環(huán)境
- AndroidStudio 2.1.2
- SDK 23.0.3
- NDK 12.1.2977051
NDK安裝與配置
- 首先創(chuàng)建一個Android項目工程隆箩,F(xiàn)ile-->New-->New Project伤锚,一路下一步就好,最后finish創(chuàng)建完成項目.
- 打開Project Structure舆乔,默認Android NDK location是沒有的,這時候如果已經(jīng)下載有了NDK剂公,那你就可以直接選擇下載好的NDK路徑設置到輸入框希俩,否則點擊download進行下載,下載完成后默認安裝在sdk根目錄纲辽,命名為ndk-bundle颜武。 // 我的SDK地址為
D:\android-sdk
.
- 添加系統(tǒng)環(huán)境變量,新建變量名
ANDROID_NDK_HOME
拖吼,對應變量值為ndk根目錄地址 鳞上,如D:\android-sdk\ndk-bundle
,然后將ANDROID_NDK_HOME
添加到Path中去(%ANDROID_NDK_HOME%;)
,確定OK. - 至此吊档,會在項目的
local.properties
文件下添加ndk的目錄地址篙议,如果沒有自動添加,可以收到加上一行:ndk.dir=D\:\\android-sdk\\ndk-bundle
,由于ndk版本和IDE的版本可能存在不一致性鬼贱,所以編譯時會檢查ndk的過時性移怯,這個時候如果報警了,可以在gradle.properties
文件下添加一行:android.useDeprecatedNdk=true
.到此这难,NDK的安裝和配置就完成.
HelloWord
- 在main下創(chuàng)建jni目錄舟误,該目錄用于存放jni文件,主要包含c文件以及頭文件等等雁佳。
- 在MainActivity中創(chuàng)建native方法脐帝,遺憾的是當前版本AndroidStudio暫不支持c文件的連接和很好的根據(jù)提示自動創(chuàng)建c方法,所以只好手動添加模板糖权。
- 在jni目錄下創(chuàng)建c文件
hello.c
堵腹,并創(chuàng)建MainActivity中的sayHello方法:
- 首先,添加頭文件星澳,類似java中的導包疚顷,這里首先必加的是jni.h,這是java與c/c++之間語言轉(zhuǎn)換的核心文件禁偎,具體可以查看ndk目錄下
D:\android-sdk\ndk-bundle\platforms\android-23\arch-arm\usr\include\jni.h
腿堤,另一個這里需要處理字符串,所以還需要包含string.h的頭文件如暖,同樣可以在上面目錄include中找到. - 然后笆檀,添加java中native方法的實現(xiàn)。
jstring
:返回值類型盒至,Java_com_lzj_demojni_MainActivity_sayHello(JNIEnv *env, jobject jobj)
:實現(xiàn)的方法名酗洒,固定格式,Java_所要實現(xiàn)的方法名所在java類用下劃線替代點的引用地址_方法名(JNI環(huán)境變量 env,JNI環(huán)境對象 jobj)
枷遂;其中env和jobj方法中可能用不到樱衷,但也必須申明,源碼中是這樣說明的酒唉,大概作用就是env作為了一個JNINativeInterface指針矩桂,是java與c/c++之間的一個功能環(huán)境變量中間橋梁。
- 具體實現(xiàn)痪伦,
(*env)->NewStringUTF(env, "Hello from JNI !");
該行代碼返回字符串Hello from JNI !侄榴,NewStringUTF
方法可以查閱jni.h,可以看到具體的申明如下:
- Gradle配置网沾,在build.gradle中加入你ndk moduleName
這里的moduleName是在代碼中l(wèi)oadLibrary所填寫的名稱癞蚕,也是生成so包的lib后面的名稱,與jni目錄下的c文件名稱沒有關系绅这,
- 代碼中調(diào)用涣达,首先需要在靜態(tài)代碼塊中l(wèi)oadLibrary,然后可以調(diào)用申明的native方法.
結束語
到這里,就完成了JNI編程的HelloWord度苔,使用項目內(nèi)部文件的方式進行JNI編程的基本步驟大致就是這樣匆篓,下一篇文章將介紹如何編譯成so包以及編譯過程中的一些配置和常見的坑。