溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Android studio JNI開發(fā)的方式有哪些

發(fā)布時間:2021-08-11 14:35:46 來源:億速云 閱讀:97 作者:小新 欄目:移動開發(fā)

這篇文章主要介紹Android studio JNI開發(fā)的方式有哪些,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

NDK 和 JNI介紹

JNI (Java Native Interface)是一套編程接口,用來實現(xiàn)Java代碼和其他語言(c、C++或匯編)進行交互。這里需要注意的是JNI是JAVA語言自己的特性,也就是說JNI和Android沒有關(guān)系。在Windows下面用JAVA做開發(fā)也經(jīng)常會用到JNI,例如:讀寫系統(tǒng)注冊表等。

NDK(Native Development Kit)是Google提供的一套工具集,可以讓你其他語言(C、C++或匯編)開發(fā) Android的 JNI。NDK可以編譯多平臺的so,開發(fā)人員只需要簡單修改 mk 文件說明需要的平臺,不需要改動任何代碼,NDK就可以幫你編譯出所需的so。

用JNI做應(yīng)用開發(fā)難度要比JAVA難很多,門檻也要高很多,如果你對C/C++把握的不好應(yīng)用還會出現(xiàn)難以發(fā)現(xiàn)的Bug!所以通常在對性能要求比較高才會使用。游戲引擎就是一個對性能要求極高的例子。另外就是如果你想把核心的一些算法或處理邏輯保護起來,選用JNI也是一個不錯的方案。

下面給大家記錄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方法名,其中包名中的點用_代替)
       第四步: 在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語言源文件 多個空格排開
       include $(BUILD_SHARED_LIBRARY) #指定生成庫類型(靜態(tài)庫 動態(tài)庫 獨立程序) 動態(tài)庫
       第五步: 在src文件夾下創(chuàng)建Application.mk,內(nèi)容如下
       APP_ABI := all #指定生成庫平臺
       第六步: 編譯c代碼生成so庫,到c代碼所在的目錄里面按住shift點擊鼠標(biāo)右鍵,
        選中在此處打開命令窗口(首先你要把ndk-build配置到環(huán)境變量中),執(zhí)行ndk-build,
        會自動生成Application.mk配置的so庫
       第七步: 在App模塊下配置jinLibs的路徑執(zhí)行l(wèi)ibs
             sourceSets{
              main{
                    jniLibs.srcDirs=[“l(fā)ibs”]
                 }
                }
        第八步: 靜態(tài)代碼塊加載
            Static{
                    System.laodLibrany(“hello”)
               }
       第九步:運行

第二種

第一步: 創(chuàng)建natice本地方法
第二步: 選中APP模塊點擊鼠標(biāo)依次選擇new->folder->JNI folder->finish
會在main目錄下生成一個jni文件夾
第三步: 在jin文件夾中創(chuàng)建.c結(jié)尾的c文件,編寫c代碼,在c語言中定義在Java代碼中創(chuàng)建的本地方法(natice方法),
要按照jni的規(guī)范定義方法(Java_包名_類名_natice方法名,其中包名中的點用_代替)
第四步: 在模塊的build.gradle deflautConfig標(biāo)簽中配置庫名和指定生成的平臺
 ndk{
   moduleName “hello”//生成的庫名
   abiFilters “armeabi”,”armeabi-v7a”,”x86”//生成的平臺
 }
第五步: 靜態(tài)代碼塊加載
  Static{
     System.laodLibrany(“hello”)
  }
第六步:運行

第三種(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生成方式
,要新建一個項目一定要選中include c++ suppot,選中之后創(chuàng)建的工程中就會有CMakelists.txt文件,
并且還有Google給出的例子)
第四步: 選中模塊點擊鼠標(biāo)右鍵,選中l(wèi)ink c++ progect with gradle之后彈出Cmake對話框,選擇CMake方式,
再找到模塊下生成的CMakeLists.txt之后ok
如果報錯了檢查CMakeLists.txt是否配置錯了,如果沒有報錯就添加成功了,會在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)的錯誤

1, No implementation found for
  意思是函數(shù)沒有實現(xiàn),
            1,檢查c中的方式是否正確(按jni規(guī)范)
            2,是否靜態(tài)加載了庫,庫名是否寫錯

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,下載一個最新版本的ndk
          2,在gradle.properties中配置
          Android.useDeprecatedNdk=true(允許使用過時ndk)

以上是“Android studio JNI開發(fā)的方式有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI