什么是jni
Android系統(tǒng)不允許一個(gè)純粹使用C/C++的程序出現(xiàn),它要求必須是通過(guò)Java代碼嵌入Native C/C++——即通過(guò)JNI的方式來(lái)使用本地(Native)代碼荒给。因此JNI對(duì)Android底層開(kāi)發(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è)打開(kāi)/關(guān)閉的方法。注意:
方法頭一定要有 native關(guān)鍵字開(kāi)頭
步驟二:生成.h文件
我們知道c/c++都是有.h的頭文件的雹舀,然后再c/cpp文件中include<xxx.h>來(lái)引用.h頭文件
所以我們必須生成.h頭文件通過(guò)命令行javah -jni來(lái)生成芦劣。
首先需要make 一下項(xiàng)目讓他生成編譯成classes文件
2:然后我們來(lái)生成.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文件已成功生成稍味。好這里這一步就已完成了
步驟三:編寫c文件。
然后我們自己在main下新建一個(gè)jni目錄荠卷,然后將.h文件copy到j(luò)ni目錄下并新建.c文件實(shí)現(xiàn)頭文件
上面說(shuō)了需要在c中引用.h頭文件模庐,所以需要include你的頭文件
注意:.c包含include頭文件的時(shí)候,一定要是你生成的.h文件油宜。
注意:.c文件中的方法名一定要與.h的方法名一致
.c文件我們看到兩個(gè)文件的方法名是一樣的掂碱。
為什么要保持一致,這跟c語(yǔ)音有關(guān)慎冤,大家應(yīng)該都知道吧疼燥,我就不解釋了(因?yàn)槲乙步忉尣磺宄?
方法名一致、方法名一致蚁堤、方法名一致
步驟四:加入ndk編譯事項(xiàng):
在:local.properties添加你下載的ndk
如果沒(méi)有下載或者不知道如何下載請(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-build的快捷命令
1:你ndk的安裝目錄,需要選中ndk-build.com文件
2:按照?qǐng)D片上添加即可剥槐。
然后我們回到j(luò)ni目錄右擊選中external tool下的ndk-build唱歧。(如果沒(méi)有以上步驟,是沒(méi)有此選項(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>
已經(jīng)成功生成.so文件。然后將其copy到j(luò)niLibs下
然后運(yùn)行温圆。就可以了挨摸。