jni操做jobject

1、 註冊JNI函數

一、         靜態方法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的函數,若是有就調用它,而自動註冊工做就在這裏完成了。

 

 

 

2、經過JNIEnv操做jobject

一、 jfieldIDjmethodID 表示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操做成員變量,以下:

 

 

3、函數簽名

    Java支持函數重載,能夠定義同名可是不一樣參數的函數,但僅僅更具函數名是沒法找到具體的函數,jni中將參數和返回值類型組合做爲一個函數的簽名信息,有了簽名信息就能夠找到java中的函數了。

 

 

雖然函數簽名很容易寫錯,可是java提供了一個javap的工具,幫助函數或變量生成簽名信息,用法以下:

javap –s  -p XXX

其中XXX爲編譯後的class文件,s表示內部數據類型的簽名信息,P表示打印全部的函數和成員的簽名信息,默認只會打印public成員函數和函數的簽名信息。

相關文章
相關標籤/搜索