Android NDK開發之從環境搭建到Demo級十步流

寫在正文以前:java

幾個月沒有更新博客,感受有點生疏了,因此說不能斷,一斷人就懶。python

其實這幾個月也並非什麼事也沒有作,俺但是時刻想着今年的任務呢,10本書,30篇博文...,這幾個月間斷性的也是在學習中,學H5,學設計模式,以及NDK JNI開發等等。android

學習JNI主要是由於公司有一些COCOS遊戲須要添加計費點,而又沒有真正的遊戲開發人員,這個重任就落到我身上了,而後就是各類虐,一虐到底,苦不堪言,這種虐並非學習技術的虐,而是一款遊戲用於N種計費點,不停的改改改,那個需求這個須要的,而後你就等着被玩吧。c++

正文windows

OK,言歸正傳,說到NDK,相信你們都不陌生,它是Google爲便於Android開發提供的一種原生開發集:Native Development Kit,並且也是一個包含API、構建工具、交叉編譯、調試器、文檔示例等一系列的工具集,能夠幫助開發者快速開發C(或C++)的動態庫,並能自動將so和java應用一塊兒打包成APK。設計模式

與NDK密切相關的另外一個詞彙則是JNI,它是NDK開發中的樞紐,Java與底層交互絕大多數都是經過它來完成的,那麼接下來看看什麼是JNI?安全

JNI:Java Native Interface 也就是java本地接口,它是一個協議,這個協議用來溝通java代碼和本地代碼(c/c++)。經過這個協議,Java類的某些方法可使用原生實現,同時讓它們能夠像普通的Java方法同樣被調用和使用,而原生方法也可使用Java對象,調用和使用Java方法。也就是說,使用JNI這種協議能夠實現:java代碼調用c/c++代碼,而c/c++代碼也能夠調用java代碼。微信

那爲何要使用NDK開發呢?app

  • 咱們都知道,java是半解釋型語言,很容易被反彙編後拿到源代碼文件,在開發一些重要協議時,咱們爲了安全起見,使用C語言來編寫這些重要的部分,來增大系統的安全性。工具

  • 在一些複雜性的計算中,要求高性能的場景中,C/C++更加的有效率,代碼也更便於複用。

固然還有其餘的優勢,這些都驅使咱們選擇相對來講高效和安全的DNK來開發咱們的應用程序。

OK,說了那麼多NDK,那到底怎麼使用NDK來開發應用程序呢?

俗話說,工欲善其事必先利其器,想要使用NDK開發,必先打磨好工具。那下面首先來看看DNK的環境搭建吧。

NDK的環境搭建

  1. 安裝配置NDK

    首先下載NDK,這裏我使用的是android-ndk-r14b-windows-x86_64,能夠自主選擇。

    1). 解壓NDK的zip包,注意路徑目錄不要出現空格和中文,這裏建議你們把包解壓到SDK目錄裏面,並命名爲ndk-bundle,好處是,啓動AS的時候會檢查它並直接添加到ndk.dir中,減小咱們的配置工做;

    2). 配置path : 把解壓好的路徑添加到環境變量path中;

    3).ndk-build:cd到解壓後NDK的根目錄,執行ndk-build命令。

  2. 給AS配置關聯NDK,這裏我使用的是androidstudio,使用Eclipse的會有所不一樣,請自行查找資料來配置。

    1). 在創建的工程中的local.properties中添加以下配置
    ndk.dir=D:\guanmanman\androidStudio\sdk\ndk-bundle,這裏注意下要使用轉義字符「」來進行字符轉義。若是ndk目錄是存放在SDK中,並命名爲ndk-bundle,這個配置會自動爲添加上去。

    2). 在工程中gradle.properties中添加對舊版本的NDK支持的配置
    android.useDeprecatedNdk=true

OK,到這裏咱們基本的NDK環境配置已基本完成,那接下來就開始咱們的NDK開發旅程吧。

Demo實例之調用本地無參方法直接返回字符串

一 layout佈局

直接在layout中添加一個按鈕Button控件,用於點擊調用本地方法:

二 在MainActivity中獲取該控件並註冊它的點擊監聽器

三 建立Java2CJNI類及本地方法

在咱們的包下直接建立一個Java2CJNI類,並在類裏建立一個java2C的本地方法:

四 經過javah命令獲取到本地頭文件

在項目根目錄下,進入main->java目錄,全選文件目錄欄,直接輸入cmd命令並按回車鍵進入docs命令,在命令中執行javah com.sanhui.ndkdemo.Java2CJNI命令:

執行完javah命令後,會在java當前目錄下建立一個.h的頭文件

五 在main目錄下建立一個jni文件夾,並把(四)中的頭文件轉移到該文件夾下

打開該文件夾能夠看到系統爲咱們建立好的本地方法頭文件。

六 建立實現頭文件的.C源文件

在jni目錄下建立一個Java2C.c的源文件,經過#include引入咱們的頭文件com_sanhui_ndkdemo_Java2CJNI.h,並把在頭文件下的聲明方法JNIEXPORT jstring JNICALL Java_com_sanhui_ndkdemo_Java2CJNI_java2C(JNIEnv *, jobject);複製到咱們的Java2C.c中,補全方法參數,並實現一個C字符串「I am From Native C .」的返回:

OK,至此咱們的代碼已編寫完畢,接下來咱們須要配置編譯後的so名稱和支持的cpu類型。

七 在該項目下的build.gradle配置生成的so名稱和支持的cpu類型

在android->defaultConfig下添加以下代碼:

ndk{
     moduleName "Java2C" //so文件名
     abiFilters "armeabi", "armeabi-v7a", "x86" //CPU類型
}

固然在這裏不配置也是能夠的,系統會用默認的項目名稱做爲so文件的名稱,而且cpu也將會支持所有類型,只是當咱們的項目名稱改變的時候,在咱們引用加載so文件的地方也須要改變,不改變的話就出現找不到so庫的異常,因此,這裏配置只是爲了便利系統生成咱們制定的so文件名,而不是根據項目名稱生成。

八 加載so庫

在咱們建立的Java2CJNI類中加載so庫,主要是爲了在咱們調用本地方法以前先編譯本地源碼。

在使用 System.loadLibrary("Java2C");加載庫時,庫名必定要與在build.gradle中配置的moduleName 名稱一致,不然將找不到庫。

九 生成so文件

在項目的工具類中選擇Build->Rebuild Project,進行從新編譯工程,而後AS會爲咱們生成so文件,so文件所在目錄爲:NDKDemo\app\build\intermediates\ndk\debug\lib下

注意:so文件命名方式是:lib+moduleName+.so

十 執行調用本地方法

在MainActivity中點擊Button按鈕調用本地方法。並經過Toast打印出來。

OK,到這裏已經完成了一個DEMO級別的NDK應用開發了,那麼來看看咱們的執行結果:

到這裏一個DEMO級別的NDK開發已經完成了,經過上面的十步已經淋漓盡致的展示了NDK開發的全部步驟流程,相信你已經徹底的學會啦。

下面章節將會講述Java調用本地C方法和C回調Java方法的實例,也會穿插的講解下JNI的更多使用,敬請期待。

更多資訊請關注微信平臺,有博客更新會及時通知。愛學習愛技術。

相關文章
相關標籤/搜索