JNI (Java Native Interface)

簡單來說JNI是用來讓JAVA可以跟C、C++溝通的介面,不論是JAVA呼叫C,或是C呼叫JAVA,由於C code通常來說比較接近底層(driver)之類的,所以有些時候可以處理JAVA無法辦到的事。


eclipse用法

需要先安裝NDK(Native Development Kit),如何安裝可參考 https://goo.gl/vvy5up

新增一個Android project後

專案點選右鍵->Android Tools->Add Native Support…->取名字(TestNDK)
到專案底下應該會看見JNI的資料夾,裡面會有你剛剛命名的TestNDK.cpp + Android.mk
Android.mk是用來告訴eclipse你有哪幾個.c或.cpp檔需要編譯,還有其他編譯時需要的參數。

打開TestNDK.cpp,如果前面有問號表示Link不到

在JNI資料夾點選右鍵->Properties->C/C++ General->Paths and Symbols->Add->File system…

選到當初NDK的路徑,要選到include資料夾D:\AndroidTools\adt-bundle-windows-x86_64-20140702\android-ndk-r10\platforms\android-17\arch-arm\usr\include

JAVA Code

MainActivity.java 加入 Libray名字

static {
    System.loadLibrary("TestNDK");
}

public native String hello(String name);

第1~3行: 載入Libray名字

第5行: 函式宣告方式

JNI Code

TestNDK.cpp 加入

函式的命名方式

  1. 須包含完整的package name,前面要串Java且 "." 部分通通換成 "_",例如 package name = com.example.testndk.MainActivity,在JNI裡就要寫成 Java_com_example_testndk_MainActivity
  2. function name也一樣,如果function name本身帶有 "_" 要改成 "_1"
  3. 格式為 JNIEXPORT + 要回傳的type + package name + function name 

完整寫法如下

JNIEXPORT jstring JNICALL
Java_com_example_testndk_MainActivity_hello( JNIEnv* env, jobject obj, jstring str ) {
    // do something...
}
創作者介紹
創作者 syhe的部落格 的頭像
syhe

syhe的部落格

syhe 發表在 痞客邦 留言(0) 人氣( 0 )