什么是jni
Android系統不允許一個純粹使用C/C++的程序出現,它要求必須是通過Java代碼嵌入Native C/C++——即通過JNI的方式來使用本地(Native)代碼。因此JNI對Android底層開發人員非常重要。
通俗一點:有很多項目可能需要調用c/c++程序,那java是不允許直接使用c/c++的,然后他提供了接口(native)調用本地的c/c++程序,這樣就實現了java下使用c/c++程序。
編寫自己的JNI模塊
步驟一:編寫調用jni的native接口方法。
在程序中新建一個類在類中寫代碼調用c/c++的原始接口。
<code>
private native static FileDescriptor open(String path, int baudrate, int flags);
public native void close();
</code>
一個打開/關閉的方法。注意:
方法頭一定要有 native關鍵字開頭
步驟二:生成.h文件
我們知道c/c++都是有.h的頭文件的,然后再c/cpp文件中include<xxx.h>來引用.h頭文件
所以我們必須生成.h頭文件通過命令行javah -jni來生成。
首先需要make 一下項目讓他生成編譯成classes文件
2:然后我們來生成.h頭文件
如圖:上有4點
1:進入Terminal控制命令行
2:javah -jni為打包.h的命令。
3:包名
4:需要生成.h的類名
注意:3、4為步驟一的絕對路徑、需要進入到app\build\intermediates\classes\debug>目錄下執行該命令。
執行上個命令之后,我們可以發現在build/classes下自動生成了一個.h頭文件
.h文件已成功生成。好這里這一步就已完成了
步驟三:編寫c文件。
然后我們自己在main下新建一個jni目錄,然后將.h文件copy到jni目錄下并新建.c文件實現頭文件
上面說了需要在c中引用.h頭文件,所以需要include你的頭文件
注意:.c包含include頭文件的時候,一定要是你生成的.h文件。
注意:.c文件中的方法名一定要與.h的方法名一致
.c文件我們看到兩個文件的方法名是一樣的。
為什么要保持一致,這跟c語音有關,大家應該都知道吧,我就不解釋了(因為我也解釋不清楚)
方法名一致、方法名一致、方法名一致
步驟四:加入ndk編譯事項:
在:local.properties添加你下載的ndk
如果沒有下載或者不知道如何下載請自行百度。
在gradle.properties下添加下句。
以上兩步:應該程序會提示你加入的。
步驟五:在build.gradle中添加ndk項
<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” 為需要生成的不同平臺也可添加你需要的平臺。
然后再步驟一添加
<pre>
static {
System.loadLibrary("serial_port");
}
</pre>
注意:名字一定要與你在moduleName "serial_port"生成.so的名稱保持一致
步驟六:build ndk
然后這一步就生成.so文件的關鍵一步。
按照以上添加ndk-build的快捷命令
1:你ndk的安裝目錄,需要選中ndk-build.com文件
2:按照圖片上添加即可。
然后我們回到jni目錄右擊選中external tool下的ndk-build。(如果沒有以上步驟,是沒有此選項的)
根據提示我們知道需要添加application.mk和android.mk文件文件,我們就在jni下添加application.mk并編寫以下內容
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
表示成功
然后我們在下面看到
已經成功生成.so文件。然后將其copy到jniLibs下
然后運行。就可以了。