記錄Android studio JNI開發(fā)的三種方式(推薦)
概述
在Andorid Studio不支持JNI開發(fā)之前大家一般都是使用Eclipse開發(fā)JNI,各種配置讓人覺得很蛋疼。從Andorid Studio支持JNI開發(fā)后,讓我們開發(fā)JNI變的如此簡單。
NDK 和 JNI介紹
JNI (Java Native Interface)是一套編程接口,用來實(shí)現(xiàn)Java代碼和其他語言(c、C++或匯編)進(jìn)行交互。這里需要注意的是JNI是JAVA語言自己的特性,也就是說JNI和Android沒有關(guān)系。在Windows下面用JAVA做開發(fā)也經(jīng)常會(huì)用到JNI,例如:讀寫系統(tǒng)注冊表等。
NDK(Native Development Kit)是Google提供的一套工具集,可以讓你其他語言(C、C++或匯編)開發(fā) Android的 JNI。NDK可以編譯多平臺的so,開發(fā)人員只需要簡單修改 mk 文件說明需要的平臺,不需要改動(dòng)任何代碼,NDK就可以幫你編譯出所需的so。
用JNI做應(yīng)用開發(fā)難度要比JAVA難很多,門檻也要高很多,如果你對C/C++把握的不好應(yīng)用還會(huì)出現(xiàn)難以發(fā)現(xiàn)的Bug!所以通常在對性能要求比較高才會(huì)使用。游戲引擎就是一個(gè)對性能要求極高的例子。另外就是如果你想把核心的一些算法或處理邏輯保護(hù)起來,選用JNI也是一個(gè)不錯(cuò)的方案。
下面給大家記錄Android studio JNI開發(fā)的三種方式,具體內(nèi)容如下所示:
第一種
第一步: 創(chuàng)建natice本地方法 第二步: 在工程App模塊目錄下創(chuàng)建jni文件夾 第三步: 在jin文件夾中創(chuàng)建.c結(jié)尾的c文件,編寫c代碼,在c語言中定義在Java代碼中創(chuàng)建的本地方法(natice方法) ,要按照jni的規(guī)范定義方法(Java_包名_類名_natice方法名,其中包名中的點(diǎn)用_代替) 第四步: 在jni文件夾中創(chuàng)建Android.mk文件,文件內(nèi)容如下 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := hello #指定生成的庫名 lib庫名.so LOCAL_SRC_FILES := hello.c #指定要編譯的C語言源文件 多個(gè)空格排開 include $(BUILD_SHARED_LIBRARY) #指定生成庫類型(靜態(tài)庫 動(dòng)態(tài)庫 獨(dú)立程序) 動(dòng)態(tài)庫 第五步: 在src文件夾下創(chuàng)建Application.mk,內(nèi)容如下 APP_ABI := all #指定生成庫平臺 第六步: 編譯c代碼生成so庫,到c代碼所在的目錄里面按住shift點(diǎn)擊鼠標(biāo)右鍵, 選中在此處打開命令窗口(首先你要把ndk-build配置到環(huán)境變量中),執(zhí)行ndk-build, 會(huì)自動(dòng)生成Application.mk配置的so庫 第七步: 在App模塊下配置jinLibs的路徑執(zhí)行l(wèi)ibs sourceSets{ main{ jniLibs.srcDirs=[“l(fā)ibs”] } } 第八步: 靜態(tài)代碼塊加載 Static{ System.laodLibrany(“hello”) } 第九步:運(yùn)行
第二種
第一步: 創(chuàng)建natice本地方法 第二步: 選中APP模塊點(diǎn)擊鼠標(biāo)依次選擇new->folder->JNI folder->finish 會(huì)在main目錄下生成一個(gè)jni文件夾 第三步: 在jin文件夾中創(chuàng)建.c結(jié)尾的c文件,編寫c代碼,在c語言中定義在Java代碼中創(chuàng)建的本地方法(natice方法), 要按照jni的規(guī)范定義方法(Java_包名_類名_natice方法名,其中包名中的點(diǎn)用_代替) 第四步: 在模塊的build.gradle deflautConfig標(biāo)簽中配置庫名和指定生成的平臺 ndk{ moduleName “hello”//生成的庫名 abiFilters “armeabi”,”armeabi-v7a”,”x86”//生成的平臺 } 第五步: 靜態(tài)代碼塊加載 Static{ System.laodLibrany(“hello”) } 第六步:運(yùn)行
第三種(Cmake)as版本2.2之后才可以使用
第一步: 創(chuàng)建natice本地方法 第二步:在main下面創(chuàng)建cpp文件夾,再在cpp文件夾中穿件c源文件 按jni規(guī)范編寫被java調(diào)用的方法 第三步:創(chuàng)建CMakelists.txt文件,里面配置了生成的庫名和連接的庫名還有c代碼的路徑(CMakelists.txt生成方式 ,要新建一個(gè)項(xiàng)目一定要選中include c++ suppot,選中之后創(chuàng)建的工程中就會(huì)有CMakelists.txt文件, 并且還有Google給出的例子) 第四步: 選中模塊點(diǎn)擊鼠標(biāo)右鍵,選中l(wèi)ink c++ progect with gradle之后彈出Cmake對話框,選擇CMake方式, 再找到模塊下生成的CMakeLists.txt之后ok 如果報(bào)錯(cuò)了檢查CMakeLists.txt是否配置錯(cuò)了,如果沒有報(bào)錯(cuò)就添加成功了,會(huì)在build.gradle生成externalNativeBuild標(biāo)簽 第五步:配置生成的so庫平臺,在deflautConfig標(biāo)簽下面創(chuàng)建externalNativeBuild標(biāo)簽 externalNativeBuild{ cmake{ abiFilters “armeabi”,”armeabi-v7a”,”x86”//生成的平臺 } } 配置完成用靜態(tài)代碼塊的方式加載so庫 Static{ System.laodLibrany(“hello”) }
可能出現(xiàn)的錯(cuò)誤
1, No implementation found for 意思是函數(shù)沒有實(shí)現(xiàn), 1,檢查c中的方式是否正確(按jni規(guī)范) 2,是否靜態(tài)加載了庫,庫名是否寫錯(cuò) 2, > Error: Your project contains C++ files but it is not using a supported native build system. Consider using CMake or ndk-build integration with the stable Android Gradle plugin: 大概意思是你的ndk不是最新的 1,下載一個(gè)最新版本的ndk 2,在gradle.properties中配置 Android.useDeprecatedNdk=true(允許使用過時(shí)ndk)
總結(jié)
以上所述是小編給大家介紹的記錄Android studio JNI開發(fā)的三種方式,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
Android評分控件RatingBar使用實(shí)例解析
這篇文章主要為大家詳細(xì)介紹了Android評分控件RatingBar使用實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10PullToRefreshListView實(shí)現(xiàn)多條目加載上拉刷新和下拉加載
這篇文章主要為大家詳細(xì)介紹了PullToRefreshListView實(shí)現(xiàn)多條目加載上拉刷新和下拉加載,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01Android圖片處理教程之全景查看效果實(shí)現(xiàn)
這篇文章主要給大家介紹了關(guān)于Android圖片處理教程之全景查看效果實(shí)現(xiàn)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-06-06Android中實(shí)現(xiàn)可滑動(dòng)的Tab的3種方式
這篇文章主要介紹了Android中實(shí)現(xiàn)可滑動(dòng)的Tab的3種方式,需要的朋友可以參考下2014-02-02Android跨進(jìn)程傳遞大數(shù)據(jù)的方法實(shí)現(xiàn)
這篇文章主要介紹了Android跨進(jìn)程傳遞大數(shù)據(jù)的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03Android 中實(shí)現(xiàn)ListView滑動(dòng)隱藏標(biāo)題欄的代碼
本文通過實(shí)例代碼給大家分享了android listview滑動(dòng)隱藏標(biāo)題欄的方法,代碼簡單易懂,需要的朋友參考下2017-01-01基于Android實(shí)現(xiàn)個(gè)性彩色好看的二維碼
二維碼在我們?nèi)粘I钪袩o處不在,今天小編通過本教程給大家介紹基于Android實(shí)現(xiàn)個(gè)性彩色好看的二維碼,需要的朋友參考下吧2016-02-02Android獲取手機(jī)號碼和運(yùn)營商信息的方法
這篇文章主要介紹了Android獲取手機(jī)號碼和運(yùn)營商信息的方法,以實(shí)例形式完整講述了獲取手機(jī)號碼和運(yùn)營商信息的技巧,代碼中包含完整的注釋說明,需要的朋友可以參考下2015-01-01Android面向切面基于AOP實(shí)現(xiàn)登錄攔截的場景示例
這篇文章主要為大家介紹了Android面向切面基于AOP實(shí)現(xiàn)登錄攔截的場景示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08Android編程實(shí)現(xiàn)設(shè)置按鈕背景透明與半透明及圖片背景透明的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)設(shè)置按鈕背景透明與半透明及圖片背景透明的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Button及ImageButton的背景屬性設(shè)置技巧,非常簡單實(shí)用,需要的朋友可以參考下2015-12-12