我的 android studio ndk 開發筆記(1)

進入android這一行這麼久,對android studio這個工具也是非常熟練了,但是就是還沒去接觸有關ndk的開發,有時候也瀏覽了一下相關的博客,但是卻也是有點亂七八糟的,估計是我沒認真去找那些寫得好的博客。
這一次認真下來,有心弄一下ndk的開發,不求弄得很懂,但求可以簡單調用就行了,經過多篇博客的認證與實驗,終於在android studio上成功生成so包,並調用成功。所以接下來我將把此篇博客作爲筆記記錄下來,以便以後重新涉及的時候不會再犯迷糊。

在開始之前,我們要先做好一些預備工作,就是配置ndk的環境變量,先下載ndk,打開android studio的sdk設置,然後下載ndk,下載後默認是在sdk目錄下面,如下圖
這裏寫圖片描述

然後新增環境變量NDK-ROOT,把ndk的目錄配置一下
,如圖所示
這裏寫圖片描述

然後在path變量當中增加ndk變量的配置
這裏寫圖片描述

因爲我是win10的關係,所以新增%NDK-ROOT%的時候,不需要前面帶分號(;),這點自己注意哈,配置好了之後,執行cmd打開命令提示符,執行ndk-build命令,如下圖就是成功了
這裏寫圖片描述

##完成以上操作後,接下來就是正式進入生成so文件的流程
首先我們先在android studio上創建一個普通的android項目,項目目錄如下:
這裏寫圖片描述

可以正常運行後,就在MainActivity中新增一個方法
public native String getStrFromJNI();
如圖:
這裏寫圖片描述

這個方法聲明中有native關鍵字,這個關鍵字表示這個方法是本地方法,也就是說這個方法getStrFromJNI()是通過本地代碼(C/C++)實現的,在java代碼中僅僅是聲明。

接下來是編譯頭文件(.h)的操作
在as底部的Terminal中,切換目錄到java下,如下圖所示,並輸入命令 javah -jni -encoding utf-8 包名.類名(如下圖所示)
這裏寫圖片描述

編譯成功後,刷新一下目錄,會發現在java目錄下會有一個.h文件,寫過c/c++的人都知道,.h文件是爲了給.c文件引用的,如圖
這裏寫圖片描述

看一下.h文件裏面的內容是怎麼樣的,如圖
這裏寫圖片描述

其實重要的部分就是這一句代碼:

JNIEXPORT jstring JNICALL Java_com_voctex_myndk_MainActivity_getStrFromJNI
(JNIEnv *, jobject);

仔細觀察可以看到他是遵循“Java_包名類名本地方法名”來組織的(瞭解到這些後我們以後就可以不生成.h文件然後直接去寫.c文件了)。

接下來是編譯.c文件的操作
我們現在app目錄下面新建一個jni的目錄,如圖
這裏寫圖片描述

然後在jni目錄下面新建.c文件,這裏我們寫了一個test.c文件,文件內容就是引用.h文件,並實現.h裏面的方法,頭文件(.h)裏面的一般都是聲明,.c文件是實現.h裏面的東西,這裏我們先把剛纔生成的.h文件放到同一個目錄下,這樣好調用,如下圖所示
這裏寫圖片描述

這裏寫圖片描述

.h和.c文件都有了,接下來就是生成so文件,以便給程序調用,這裏我們要生成Android.mk文件,並做好配置信息(這裏有個要注意的地方,待會會說明強調)
這裏寫圖片描述

然後在底部的Terminal中,切換目錄到app目錄下,執行命令ndk-build編譯生成so文件,如果在app下面的libs生成so包就說明成功了,obj目錄也是生成的,但是沒有什麼卵用,可以直接忽視,當然你也可以刪了,如下圖:
這裏寫圖片描述

成功生成so包後,接下來就是調用該so,在app下面的build.gradle文件裏面增加配置,如下圖
這裏寫圖片描述

在MainActivity類裏先加載該so包,然後就可以執行so包裏面的方法了,如下圖
這裏寫圖片描述

直接運行,界面就會顯示so裏面定義好的字符串,如下圖所示
這裏寫圖片描述

到這裏就算是成功了,自己編譯生成so包,然後自己調用,這應該算是ndk開發的入門級了吧,哈哈哈哈。以後自己再接觸的時候就不會再被坑了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章