像小白一樣學(xué)習(xí)android jni編程

什么是jni

Android系統(tǒng)不允許一個(gè)純粹使用C/C++的程序出現(xiàn),它要求必須是通過Java代碼嵌入Native C/C++——即通過JNI的方式來使用本地(Native)代碼。因此JNI對(duì)Android底層開發(fā)人員非常重要。
通俗一點(diǎn):有很多項(xiàng)目可能需要調(diào)用c/c++程序,那java是不允許直接使用c/c++的,然后他提供了接口(native)調(diào)用本地的c/c++程序,這樣就實(shí)現(xiàn)了java下使用c/c++程序。


編寫自己的JNI模塊

步驟一:編寫調(diào)用jni的native接口方法。

在程序中新建一個(gè)類在類中寫代碼調(diào)用c/c++的原始接口。
<code>
private native static FileDescriptor open(String path, int baudrate, int flags);
public native void close();
</code>
一個(gè)打開/關(guān)閉的方法。注意:
方法頭一定要有 native關(guān)鍵字開頭

步驟二:生成.h文件

我們知道c/c++都是有.h的頭文件的,然后再c/cpp文件中include<xxx.h>來引用.h頭文件

所以我們必須生成.h頭文件通過命令行javah -jni來生成。

make project

首先需要make 一下項(xiàng)目讓他生成編譯成classes文件


編譯生成classes

2:然后我們來生成.h頭文件

生成.h

如圖:上有4點(diǎn)

1:進(jìn)入Terminal控制命令行

2:javah -jni為打包.h的命令。

3:包名

4:需要生成.h的類名

注意:3、4為步驟一的絕對(duì)路徑、需要進(jìn)入到app\build\intermediates\classes\debug>目錄下執(zhí)行該命令。

執(zhí)行上個(gè)命令之后,我們可以發(fā)現(xiàn)在build/classes下自動(dòng)生成了一個(gè).h頭文件


.h文件

.h文件已成功生成。好這里這一步就已完成了


步驟三:編寫c文件。

然后我們自己在main下新建一個(gè)jni目錄,然后將.h文件copy到j(luò)ni目錄下并新建.c文件實(shí)現(xiàn)頭文件


編寫c文件

上面說了需要在c中引用.h頭文件,所以需要include你的頭文件

注意:.c包含include頭文件的時(shí)候,一定要是你生成的.h文件。

注意:.c文件中的方法名一定要與.h的方法名一致

.c文件
.c文件

.h文件
.h文件

我們看到兩個(gè)文件的方法名是一樣的。

為什么要保持一致,這跟c語音有關(guān),大家應(yīng)該都知道吧,我就不解釋了(因?yàn)槲乙步忉尣磺宄?

方法名一致、方法名一致、方法名一致


步驟四:加入ndk編譯事項(xiàng):

在:local.properties添加你下載的ndk

如果沒有下載或者不知道如何下載請(qǐng)自行百度。

在gradle.properties下添加下句。

以上兩步:應(yīng)該程序會(huì)提示你加入的。


步驟五:在build.gradle中添加ndk項(xiàng)

<pre>
<code>
ndk{
moduleName "serial_port"
abiFilters "armeabi", "armeabi-v7a", "x86"
}

sourceSets.main {
jni.srcDirs = ['libs']
}

</code>
</pre>

moduleName "serial_port"生成.so的名稱

abiFilters "armeabi" ,"armeabi-v7a",“x86” 為需要生成的不同平臺(tái)也可添加你需要的平臺(tái)。

然后再步驟一添加
<pre>
static {
System.loadLibrary("serial_port");
}
</pre>

注意:名字一定要與你在moduleName "serial_port"生成.so的名稱保持一致

步驟六:build ndk

然后這一步就生成.so文件的關(guān)鍵一步。


ndk快捷命令

按照以上添加ndk-build的快捷命令

1:你ndk的安裝目錄,需要選中ndk-build.com文件

2:按照?qǐng)D片上添加即可。

然后我們回到j(luò)ni目錄右擊選中external tool下的ndk-build。(如果沒有以上步驟,是沒有此選項(xiàng)的)

居然提示:

根據(jù)提示我們知道需要添加application.mk和android.mk文件文件,我們就在jni下添加application.mk并編寫以下內(nèi)容

application.mk
<pre>
APP_ABI := armeabi armeabi-v7a x86
</pre>

android.mk
<pre>
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

TARGET_PLATFORM := android-3
LOCAL_MODULE := serial_port
LOCAL_SRC_FILES := SerialPort.c
LOCAL_LDLIBS := -llog

include $(BUILD_SHARED_LIBRARY)
</pre>

注意.c名稱,然后再ndk-build

表示成功
然后我們?cè)谙旅婵吹?/p>

生成的.so文件

已經(jīng)成功生成.so文件。然后將其copy到j(luò)niLibs下

然后運(yùn)行。就可以了。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容