一、 靜態方法java
通常使用javah進行編譯,生成很長的文件名和函數名字,這個書寫不方便,影響運行效率。函數
二、 動態註冊工具
使用JNINativeMethod的結構,定義以下:指針
typedef struct {編譯
const char* name; //java中函數的名字,不帶包路徑class
const char* signature ; //java函數的簽名信息效率
void * fnPtr; //JNI層對應函數的函數指針變量
}JNINativeMethod;object
AndroidRunTime類提供了一個registerNativeMethods函數來完成註冊工做。數據類型
當java經過System.loadLibrary加載完JNI動態庫後,緊接着會查找庫中一個叫作JNI_OnLoad的函數,若是有就調用它,而自動註冊工做就在這裏完成了。
一、 jfieldID 和 jmethodID 表示java類的成員變量和成員函數
jfieldID GetFieldID(jclass clazz, const char* name , const char *sig);
jmethodID GetMethodID(jclass clazz, const char* name, const char* sig);
其中 jclass表明java類
name表示成員函數或者變量名
sig這個爲函數和變量的簽名信息
若是每次操做jobject都去查詢jmethodID或者jfieldID會影響程序的運行效率,因此咱們在初始化的時候將ID保存起來供後續使用。
二、使用jfieldID和jmethodID
代碼以下:
經過JNIEnv輸出CallVoidMethod的函數,以下:
其中type對應java函數的返回值類型,例如:CallIntMethod,CallVoidMethod等。
上面針對的是非static函數,若是想掉用java中的static函數,則JNIEnv輸出CallStatic<type>Method系列函數。
經過jfieldID操做成員變量,以下:
Java支持函數重載,能夠定義同名可是不一樣參數的函數,但僅僅更具函數名是沒法找到具體的函數,jni中將參數和返回值類型組合做爲一個函數的簽名信息,有了簽名信息就能夠找到java中的函數了。
雖然函數簽名很容易寫錯,可是java提供了一個javap的工具,幫助函數或變量生成簽名信息,用法以下:
javap –s -p XXX
其中XXX爲編譯後的class文件,s表示內部數據類型的簽名信息,P表示打印全部的函數和成員的簽名信息,默認只會打印public成員函數和函數的簽名信息。