1. 程式人生 > >Android JNI 介面總結

Android JNI 介面總結

JNI Reference Exmaple

在寫android NDK的時候常常用到的一些JNI API的總結(參考官方文件:JNI API

常用的操作類

jclass DefineClass(JNIEnv *env, jobject loader, const jbyte *buf, jsize buf_len);
  • 功能:Loads a class from a buffer of raw class data. The buffer containing the raw class data is not referenced by the VM after the DefineClass call returns, and it may be discarded if desired.

  • 引數:
    env JNI 介面指標。
    loader 分派給所定義的類的類載入器。
    buf 包含 .class 檔案資料的緩衝區。
    buf_len 緩衝區長度。

  • 返回: Java 類物件。如果出錯則返回NULL
    *丟擲:
    ClassFormatError 如果類資料指定的類無效。
    ClassCircularityError 如果類或介面是自身的超類或超介面。
    OutOfMemoryError 如果系統記憶體不足。
     jclass FindClass (JNIEnv *env, const char *name);                
  • 功能: 該函式用於載入本地定義的類。它將搜尋由CLASSPATH 環境變數為具有指定名稱的類所指定的目錄和 zip檔案。
  • 引數:env JNI 介面指標。
  • name 類全名(即包名後跟類名,之間由”/”分隔).如果該名稱以“[(陣列簽名字元)打頭,則返回一個數組類。
  • 返回值:返回類物件全名。如果找不到該類,則返回 NULL。
  • 丟擲:
    ClassFormatError 如果類資料指定的類無效。
    ClassCircularityError 如果類或介面是自身的超類或超介面。
    NoClassDefFoundError 如果找不到所請求的類或介面的定義。
    OutOfMemoryError 如果系統記憶體不足。
jclass GetObjectClass (JNIEnv *env, jobject obj); 
  • 功能:通過物件獲取這個類。該函式比較簡單,唯一注意的是物件不能為NULL,否則獲取的class肯定返回也為NULL。
  • 引數: env JNI 介面指標。
  • obj Java 類物件例項。
    jclass GetSuperclass (JNIEnv *env, jclass clazz);          
  • 功能:獲取父類或者說超類 。 如果 clazz 代表類class而非類 object,則該函式返回由 clazz 所指定的類的超類。 如果 clazz 指定類 object 或代表某個介面,則該函式返回NULL。

  • 引數:
    env JNI 介面指標。
    clazz Java 類物件。

  • 返回值:
    由 clazz 所代表的類的超類或 NULL。

異常丟擲

    jint  Throw(JNIEnv *env, jthrowable obj);         
  • 功能:丟擲 java.lang.Throwable 物件。
  • 引數:
    env JNI 介面指標。
    obj java.lang.Throwable 物件。

  • 返回值: 成功時返回 0,失敗時返回負數。

  • 丟擲: java.lang.Throwable 物件 obj。
    jint ThrowNew (JNIEnv *env ,  jclass clazz,  const char *message);            
  • 功能:利用指定類的訊息(由 message 指定)構造異常物件並丟擲該異常。
  • 引數:
    env JNI 介面指標。
    clazz java.lang.Throwable 的子類。
    message 用於構造java.lang.Throwable物件的訊息。

  • 返回值: 成功時返回 0,失敗時返回負數。

  • 丟擲: 新構造的 java.lang.Throwable 物件。
    jthrowable ExceptionOccurred (JNIEnv *env);              
  • 功能:確定是否某個異常正被丟擲。在平臺相關程式碼呼叫 ExceptionClear() 或 Java 程式碼處理該異常前,異常將始終保持丟擲狀態。

  • 引數: env JNI 介面指標。

  • 返回值:返回正被丟擲的異常物件,如果當前無異常被丟擲,則返回NULL。
    void ExceptionDescribe (JNIEnv *env);         
  • 功能:將異常及堆疊的回溯輸出到系統錯誤報告通道(例如 stderr)。該例程可便利除錯操作。
  • 引數:env JNI 介面指標。
    void ExceptionClear (JNIEnv *env);                
  • 功能:清除當前丟擲的任何異常。如果當前無異常,則此例程不產生任何效果。
  • 引數: env JNI 介面指標。

  • void FatalError (JNIEnv *env, const char *msg);

  • 功能:丟擲致命錯誤並且不希望虛擬機器進行修復。該函式無返回值。
  • 引數:
    env JNI 介面指標。
    msg 錯誤訊息。

全域性及區域性引用

   jobject NewGlobalRef (JNIEnv *env, jobject obj);         
  • 功能:建立 obj 引數所引用物件的新全域性引用。obj 引數既可以是全域性引用,也可以是區域性引用。全域性引用通過呼叫 DeleteGlobalRef() 來顯式撤消。
  • 引數:
    env JNI 介面指標。
    obj 全域性或區域性引用。
  • 返回值: 返回全域性引用。如果系統記憶體不足則返回 NULL。
    void DeleteGlobalRef (JNIEnv *env, jobject globalRef);                 
  • 功能: 刪除 globalRef 所指向的全域性引用。
  • 引數:
    env JNI 介面指標。
    globalRef 全域性引用。
    void  DeleteLocalRef (JNIEnv *env, jobject localRef);          
  • 功能: 刪除 localRef所指向的區域性引用。
  • 引數:
    env JNI 介面指標。
    localRef 區域性引用。

物件操作

jobject AllocObject (JNIEnv *env, jclass clazz);              
  • 功能:分配新 Java 物件而不呼叫該物件的任何建構函式。返回該物件的引用。clazz 引數務必不要引用陣列類。
  • 引數:
    env JNI 介面指標。
    clazz Java 類物件。
  • 返回值: 返回 Java 物件。如果無法構造該物件,則返回NULL。
  • 丟擲:
    InstantiationException:如果該類為一個介面或抽象類。
    OutOfMemoryError:如果系統記憶體不足。
  jobject NewObject (JNIEnv *env ,  jclass clazz,  jmethodID methodID, ...);   //引數附加在函式後面    

  jobject NewObjectA (JNIEnv *env , jclassclazz,  jmethodID methodID, jvalue *args);    //引數以指標形式附加           
  jobjec tNewObjectV (JNIEnv *env , jclassclazz,  jmethodID methodID, va_list args);    //引數以"連結串列"形式附加            
  • 功能:構造新 Java 物件。方法 ID指示應呼叫的建構函式方法。注意:該 ID特指該類class的建構函式ID , 必須通過呼叫 GetMethodID() 獲得,且呼叫時的方法名必須為 ,而返回型別必須為 void (V)。clazz引數務必不要引用陣列類。
  • 引數:
    env JNI 介面指標。
    clazz Java 類物件。
    methodID 建構函式的方法 ID。
    NewObject 的其它引數: 傳給建構函式的引數,可以為空 。
    NewObjectA 的其它引數: args:傳給建構函式的引數陣列。
    NewObjectV 的其它引數: args:傳給建構函式的引數 va_list。

  • 返回值: 返回 Java 物件,如果無法構造該物件,則返回NULL。

  • 丟擲:
    InstantiationException 如果該類為介面或抽象類。
    OutOfMemoryError 如果系統記憶體不足。
    建構函式丟擲的任何異常。
  jclass GetObjectClass (JNIEnv *env, jobject obj);         
  • 功能:返回物件的類。
  • 引數:
    env JNI 介面指標。
    obj Java 物件(不能為 NULL)。
  • 返回值: 返回 Java 類物件。
 jboolean IsInstanceOf (JNIEnv *env, jobject obj, jclass clazz);             
  • 功能:測試物件是否為某個類的例項。
  • 引數:
    env JNI 介面指標。
    obj Java 物件。
    clazz Java 類物件。

  • 返回值:如果可將 obj 強制轉換為 clazz,則返回 JNI_TRUE。否則返回 JNI_FALSE。NULL 物件可強制轉換為任何類。

 jbooleanIsSameObject (JNIEnv *env, jobjectref1, jobject ref2);            
  • 功能:測試兩個引用是否引用同一 Java 物件。
  • 引數:
    env JNI 介面指標。
    ref1 Java 物件。
    ref2 Java 物件。
  • 返回值: 如果 ref1 和 ref2 引用同一 Java 物件或均為 NULL,則返回 JNI_TRUE。否則返回 JNI_FALSE。

字串操作

jstring  NewString (JNIEnv *env, const jchar *unicodeChars,   jsize len);         
  • 功能:利用 Unicode 字元陣列構造新的 java.lang.String 物件。
  • 引數:
    env:JNI 介面指標。
    unicodeChars:指向 Unicode 字串的指標。
    len:Unicode 字串的長度。
  • 返回值: Java 字串物件。如果無法構造該字串,則為NULL。
  • 丟擲: OutOfMemoryError:如果系統記憶體不足。
jsize  GetStringLength (JNIEnv *env, jstring string);            
  • 功能:返回 Java 字串的長度(Unicode 字元數)。
  • 引數: env:JNI 介面指標。
  • string:Java 字串物件。
  • 返回值: Java 字串的長度。
const  jchar *  GetStringChars (JNIEnv*env, jstring string,  jboolean *isCopy);           
  • 功能:返回指向字串的 Unicode 字元陣列的指標。該指標在呼叫 ReleaseStringchars() 前一直有效。
    如果 isCopy 非空,則在複製完成後將 *isCopy 設為 JNI_TRUE。如果沒有複製,則設為JNI_FALSE。
  • 引數:
    env:JNI 介面指標。
    string:Java 字串物件。
    isCopy:指向布林值的指標。

  • 返回值:指向 Unicode 字串的指標,如果操作失敗,則返回NULL。

 void  ReleaseStringChars (JNIEnv *env, jstring string,  const jchar *chars);                  
  • 功能:通知虛擬機器平臺相關程式碼無需再訪問 chars。引數chars 是一個指標,可通過 GetStringChars() 從 string 獲得。
  • 引數:
    env:JNI 介面指標。
    string:Java 字串物件。
    chars:指向 Unicode 字串的指標。
jstring  NewStringUTF (JNIEnv *env, const char *bytes);            
  • 功能:利用 UTF-8 字元陣列構造新 java.lang.String 物件。
  • 引數:
    env:JNI 介面指標。如果無法構造該字串,則為 NULL。
    bytes:指向 UTF-8 字串的指標。

  • 返回值:Java 字串物件。如果無法構造該字串,則為NULL。

  • 丟擲: OutOfMemoryError:如果系統記憶體不足。
jsize  GetStringUTFLength (JNIEnv *env, jstring string);              
  • 功能:以位元組為單位返回字串的 UTF-8 長度。
  • 引數:
    env:JNI 介面指標。
    string:Java 字串物件。
  • 返回值: 返回字串的 UTF-8
const char* GetStringUTFChars (JNIEnv*env, jstring string, jboolean *isCopy);           
  • 功能:返回指向字串的 UTF-8 字元陣列的指標。該陣列在被ReleaseStringUTFChars() 釋放前將一直有效。 如果 isCopy 不是 NULL,*isCopy 在複製完成後即被設為 JNI_TRUE。如果未複製,則設為 JNI_FALSE。
  • 引數:
    env:JNI 介面指標。
    string:Java 字串物件。
    isCopy:指向布林值的指標。

  • 返回值: 指向 UTF-8 字串的指標。如果操作失敗,則為 NULL。

void  ReleaseStringUTFChars (JNIEnv *env, jstring string,  const char *utf);               
  • 功能:通知虛擬機器平臺相關程式碼無需再訪問 utf。utf 引數是一個指標,可利用 GetStringUTFChars() 獲得。
  • 引數:
    env:JNI 介面指標。
    string:Java 字串物件。
    utf:指向 UTF-8 字串的指標。

陣列操作

jsize GetArrayLength (JNIEnv *env, jarray array);                 
  • 功能:返回陣列中的元素數。
  • 引數:
    env:JNI 介面指標。
    array:Java 陣列物件。
  • 返回值: 陣列的長度。
jarray NewObjectArray (JNIEnv *env, jsize length,  jclass elementClass, jobject initialElement);           
  • 功能:構造新的陣列,它將儲存類 elementClass 中的物件。所有元素初始值均設為 initialElement。
  • 引數:
    env:JNI 介面指標。
    length:陣列大小。
    elementClass:陣列元素類。
    initialElement:初始值。 可以為NULL 。

  • 返回值:Java 陣列物件。如果無法構造陣列,則為 NULL。

  • 丟擲: OutOfMemoryError:如果系統記憶體不足。

說明: 使用該函式時,為了便於易操作性,我們一般可以用jobjectArray陣列型別或得返回值,例如:
jobjectArray objArray = env->NewObjectArray ( );
//操作該物件
env->GetObjectArrayElement (objArray, 0);//獲得該object陣列在索引0處的值 ,(可以強制轉換型別).

jobject  GetObjectArrayElement (JNIEnv *env, jobjectArray array, jsize index);                
  • 功能:返回 Object 陣列的元素。
  • 引數:
    env:JNI 介面指標。
    array:Java 陣列。
    index:陣列下標。
  • 返回值: Java 物件。
  • 丟擲: ArrayIndexOutOfBoundsException:如果 index 不是陣列中的有效下標。
void  SetObjectArrayElement (JNIEnv *env, jobjectArray array,  jsize index, jobject value);                
  • 功能:設定 Object 陣列的元素。
  • 引數:
    env:JNI 介面指標。
    array:Java 陣列。
    index:陣列下標。
    value:新值。
  • 丟擲:
    ArrayIndexOutOfBoundsException:如果 index 不是陣列中的有效下標。
    ArrayStoreException:如果 value 的類不是陣列元素類的子類。
New<PrimitiveType>Array     
NativeType New<PrimitiveType>Array (JNIEnv *env, ArrayType array, jboolean*isCopy);                  
  • 說明: 用於構造新基本型別陣列物件的一系列操作。下表說明了特定的基本型別陣列建構函式。使用者應把
    NewArray 替換為某個實際的基本型別陣列建構函式例程名(見下表),然後將 ArrayType替換為
     該例程相應的陣列型別。
  • 引數:
    env : JNI 介面指標。
    length:陣列長度。
  • 返回值: Java 陣列。如果無法構造該陣列,則為 NULL。
New<PrimitiveType>Array type        
NewBooleanArray()              jbooleanArray 
NewByteArray()                 jbyteArray       
NewCharArray()                 jcharArray       
NewShortArray()                jshortArray      
NewIntArray()                  jintArray 
NewLongArray()                 jlongArray        
NewFloatArray()                jfloatArray       
NewDoubleArray()               jdoubleArray   
Get<PrimitiveType>ArrayElements      
NativeType *Get<PrimitiveType>ArrayElements (JNIEnv *env, ArrayType array, jboolean*isCopy);                  
  • 說明:
    一組返回基本型別陣列體的函式。結果在呼叫相應的 ReleaseArrayElements()函式前將一直有效。由於返回的陣列可能是 Java 陣列的副本,因此對返回陣列的更改不必在基本型別陣列中反映出來,直到呼叫了

ReleaseArrayElements()。 如果 isCopy 不是 NULL,*isCopy 在複製完成後即被設為 JNI_TRUE。如果未複製,則設為 JNI_FALSE。

  • 使用說明:
    將 GetArrayElements 替換為表中某個實際的基本型別元素訪問器例程名。
    將 ArrayType 替換為對應的陣列型別.
    將 NativeType 替換為該例程對應的本地型別.
  • 引數:
    env:JNI 介面指標。
    array:Java 字串物件。
    isCopy:指向布林值的指標。
  • 返回值:返回指向陣列元素的指標,如果操作失敗,則為 NULL。

不管布林陣列在 Java 虛擬機器中如何表示,GetBooleanArrayElements() 將始終返回一個 jbooleans 型別的指標,其中每一位元組代表一個元素(開包表示)。記憶體中將確保所有其它型別。

Get<PrimitiveType>ArrayElements 例程         陣列型別                  本地型別
GetBooleanArrayElements()                   jbooleanArray             jboolean
GetByteArrayElements()                      jbyteArray                jbyte
GetCharArrayElements()                      jcharArray                jchar
GetShortArrayElements()                     jshortArray               jshort
GetIntArrayElements()                       jintArray                 jint
GetLongArrayElements()                      jlongArray                jlong
GetFloatArrayElements()                     jfloatArray               jfloat
GetDoubleArrayElements()                    jdoubleArray              jdouble
Release<PrimitiveType>ArrayElements 方法型別                
void  Release<PrimitiveType>ArrayElements (JNIEnv *env, ArrayType array, NativeType *elems,jint mode);            
  • 功能:通知虛擬機器平臺相關程式碼無需再訪問 elems 的一組函式。elems 引數是一個通過使用對應的
    GetArrayElements() 函式由 array 匯出的指標。必要時,該函式將把對 elems 的修改複製回基本
    型別陣列。mode引數將提供有關如何釋放陣列緩衝區的資訊。如果elems 不是 array 中陣列元素的副本,mode將無效。
    否則,mode 將具有下表所述的功能:
模式                                         動作        
0                            複製回內容並釋放elems 緩衝區      
JNI_COMMIT                  複製回內容但不釋放elems 緩衝區  
JNI_ABORT                   釋放緩衝區但不復制回變化        

多數情況下,程式設計人員將把“0”傳給 mode 引數以確保固定的陣列和複製的陣列保持一致。其它選項可以使程式設計人員進一步控制記憶體管理,但使用時務必慎重。

  • 使用說明:
    將 ArrayType 替換為對應的陣列型別。
    將 NativeType 替換為該例程對應的本地型別。

  • 引數: env:JNI 介面指標。
    array:Java 陣列物件。
    elems:指向陣列元素的指標。
    mode:釋放模式。

Release<PrimitiveType>ArrayElements 方法組         陣列型別             本地型別
ReleaseBooleanArrayElements()                      jbooleanArray        jboolean
ReleaseByteArrayElements()                         jbyteArray           jbyte
ReleaseCharArrayElements()                         jcharArray           jchar
ReleaseShortArrayElements()                        jshortArray          jshort
ReleaseIntArrayElements()                          jintArray            jint
ReleaseLongArrayElements()                         jlongArray           jlong
ReleaseFloatArrayElements()                        jfloatArray          jfloat
ReleaseDoubleArrayElements()                       jdoubleArray         jdouble
Get<PrimitiveType>ArrayRegion 方法型別          
void  Get<PrimitiveType>ArrayRegion (JNIEnv *env, ArrayType array,  jsize start, jsize len, NativeType *buf);            
  • 功能:將基本型別陣列某一區域複製到緩衝區中的一組函式。
  • 使用說明:
    將 GetArrayRegion 替換為下表的某個實際基本型別元素訪問器例程名。
    將 ArrayType 替換為對應的陣列型別。
    將 NativeType 替換為該例程對應的本地型別。
  • 引數: env:JNI 介面指標。
    array:Java 指標。
    start:起始下標。
    len:要複製的元素數。
    buf:目的緩衝區。
  • 丟擲: ArrayIndexOutOfBoundsException:如果區域中的某個下標無效。
方法族如下:                             
Get<PrimitiveType>ArrayRegion方法      陣列型別          本地型別
GetBooleanArrayRegion()                jbooleanArray     jboolean
GetByteArrayRegion()                   jbyteArray        jbyte
GetCharArrayRegion()                   jcharArray        jchar
GetShortArrayRegion()                  jshortArray       jhort
GetIntArrayRegion()                    jintArray         jint
GetLongArrayRegion()                   jlongArray        jlong
GetFloatArrayRegion()                  jfloatArray       jloat
GetDoubleArrayRegion()                 jdoubleArray      jdouble
Set<PrimitiveType>ArrayRegion 方法型別          
void  Set<PrimitiveType>ArrayRegion (JNIEnv *env, ArrayType array,   jsize start, jsize len, NativeType *buf);            
  • 功能:將基本型別陣列的某一區域從緩衝區中複製回來的一組函式。
  • 使用說明: 將 SetArrayRegion 替換為表中的實際基本型別元素訪問器例程名。
    將 ArrayType 替換為對應的陣列型別。
    將 NativeType 替換為該例程對應的本地型別。
  • 引數:
    env:JNI 介面指標。
    array: Java 陣列。
    start:起始下標。
    len:要複製的元素數。
    buf:源緩衝區。
  • 丟擲:
    ArrayIndexOutOfBoundsException:如果區域中的某個下標無效。
     
Set<PrimitiveType>ArrayRegion           陣列型別         本地型別
SetBooleanArrayRegion()                  jbooleanArray     jboolean
SetByteArrayRegion()                     jbyteArray        jbyte
SetCharArrayRegion()                     jcharArray        jchar
SetShortArrayRegion()                    jshortArray       jshort
SetIntArrayRegion()                      jintArray         jint
SetLongArrayRegion()                     jlongArray        jlong
SetFloatArrayRegion()                    jfloatArray       jfloat
SetDoubleArrayRegion()                   jdoubleArray      jdouble

訪問物件的屬性和方法

1.例項屬性的訪問

jfieldID  GetFieldID (JNIEnv *env, jclass clazz, const char *name, const char *sig);                
  • 功能:返回類的例項(非靜態)域的屬性 ID。該域由其名稱及簽名指定。訪問器函式的GetField 及 SetField系列使用域 ID 檢索物件域。GetFieldID() 不能用於獲取陣列的長度域。應使用GetArrayLength()。
  • 引數:
    env:JNI 介面指標。
    clazz:Java 類物件。
    name: 該屬性的Name名稱
    sig: 該屬性的域簽名。

  • 返回值:屬性ID。如果操作失敗,則返回NULL。

  • 丟擲:
    NoSuchFieldError:如果找不到指定的域。
    ExceptionInInitializerError:如果由於異常而導致類初始化程式失敗。
    OutOfMemoryError:如果系統記憶體不足。
NativeType  Get<type>Field (JNIEnv*env, jobject obj, jfieldID fieldID);                
  • 功能:該訪問器例程系列返回物件的例項(非靜態)域的值。要訪問的域由通過呼叫GetFieldID() 而得到的域 ID 指定。
  • 引數:
    env:JNI 介面指標。
    obj:Java 物件(不能為 NULL)。
    fieldID:有效的域 ID。
    返回值: 屬性的內容。
Get<type>Field 例程名             本地型別        
GetObjectField()                   jobject     
GetBooleanField()                  jboolean  
GetByteField()                     jbyte        
GetCharField()                     jchar        
GetShortField()                    jshort       
GetIntField()                      jint  
GetLongField()                     jlong         
GetFloatField()                    jfloat        
GetDoubleField()                   jdouble    
Set<type>Field 方法族 
void  Set<type>Field (JNIEnv *env, jobject obj, jfieldID fieldID,  NativeType value);           
  • 功能: 該訪問器例程系列設定物件的例項(非靜態)屬性的值。要訪問的屬性由通過呼叫SetFieldID() 而得到的屬性 ID指定。
  • 引數:
    env:JNI 介面指標。
    obj:Java 物件(不能為 NULL)。
    fieldID:有效的域 ID。
    value:域的新值。

方法族 如下:  

Set<type>Field 方法族            本地型別        
SetObjectField()                 jobject     
SetBooleanField()                jboolean  
SetByteField()                   jbyte        
SetCharField()                   jchar        
SetShortField()                  jshort       
SetIntField()                    jint  
SetLongField()                   jlong         
SetFloatField()                  jfloat        
SetDoubleField()                 jdouble    

2.靜態屬性的訪問

jfieldID  GetStaticFieldID (JNIEnv *env,jclass clazz, const char *name, const char *sig);     
NativeType  GetStatic<type>Field (JNIEnv*env,jclass classzz , jfieldID fieldID);           
void  SetStatic<type>Field (JNIEnv *env,jclassclasszz, jfieldID fieldID,  NativeType value);

3.呼叫例項方法

jmethodID GetMethodID(JNIEnv *env, jclass clazz,    const char *name, const char *sig);                
  • 功能:返回類或介面例項(非靜態)方法的方法 ID。方法可在某個 clazz 的超類中定義,也可從 clazz 繼承。該方法由其名稱和簽名決定。 GetMethodID() 可使未初始化的類初始化。要獲得建構函式的方法 ID,應將 作為方法名,同時將 void (V) 作為返回型別。

  • 引數:
    env:JNI 介面指標。
    clazz:Java 類物件。
    name:方法名。
    sig:方法的簽名。

  • 返回值: 方法 ID,如果找不到指定的方法,則為 NULL。

  • 丟擲:
    NoSuchMethodError:如果找不到指定方法。
    ExceptionInInitializerError:如果由於異常而導致類初始化程式失敗。
    OutOfMemoryError:如果系統記憶體不足。
Call<type>Method 例程  、Call<type>MethodA 例程  、Call<type>MethodV 例程 
NativeType Call<type>Method (JNIEnv*en v,  jobject obj , jmethodID methodID, ...);
NativeType Call<type>MethodA (JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args);
NativeType Call<type>MethodV (JNIEnv *env, jobject obj,jmethodID methodID, va_list args);
  • 說明:
    這三個操作的方法用於從本地方法呼叫Java 例項方法。它們的差別僅在於向其所呼叫的方法傳遞引數時所用的機制。 這三個操作將根據所指定的方法 ID 呼叫 Java 物件的例項(非靜態)方法。引數 methodID 必須通過呼叫 GetMethodID() 來獲得。當這些函式用於呼叫私有方法和建構函式時,方法 ID 必須從obj 的真實類派生而來,而不應從其某個超類派生。當然,附加引數可以為空 。

  • 引數:
    env:JNI 介面指標。
    obj:Java 物件。
    methodID:方法 ID。

  • 返回值: 返回呼叫 Java 方法的結果。

  • 丟擲: 執行 Java 方法時丟擲的異常。

下表根據結果型別說明了各個方法型別。使用者應將CallMethod 中的 type 替換為所呼叫方法的Java 型別(或使用表中的實際方法名),同時將 NativeType 替換為該方法相應的本地型別。省略掉了其他兩種型別。

“`
Java層返回值 方法族 本地返回型別NativeType

返回值為void : CallVoidMethod() A/V (無)
返回值為引用型別: CallObjectMethod() jobect
返回值為boolean : CallBooleanMethod () jboolean
返回值為byte : CallByteMethod() jbyte
返回值為char : CallCharMethod() jchar
返回值為short CallShortMethod() jshort
返回值為int : CallIntMethod() jint
返回值為long: CallLongMethod() jlong
返回值為float : CallFloatMethod() jfloat
返回值為double: CallDoubleMethod() jdouble


#### 4.呼叫靜態方法

jfieldID GetStaticMethodID (JNIEnv *env,jclass clazz, const char *name, const char *sig);
NativeType CallMethod (JNIEnv*env,jclass classzz , jfieldID fieldID);


## 註冊本地方法   

jint RegisterNatives (JNIEnv *env, jclass clazz, const JNINativeMethod *methods,jint nMethods);


* 功能:向 clazz 引數指定的類註冊本地方法。methods 引數將指定 JNINativeMethod 結構的陣列,其中包含本地方法的名稱、簽名和函式指標。nMethods 引數將指定陣列中的本地方法數。JNINativeMethod 結構定義如下所示:            

typedef struct {
char *name;
char *signature;
void *fnPtr;
} JNINativeMethod;


函式指標通常必須有下列簽名:                                  

ReturnType (*fnPtr)(JNIEnv *env, jobject objectOrClass, …);


* 引數:
env:JNI 介面指標。            
clazz:Java 類物件。            
methods:類中本地方法和具體實現方法的對映指標。               
nMethods:類中的本地方法數。                 
* 返回值:  成功時返回 "0";失敗時返回負數。         
* 丟擲:  NoSuchMethodError:如果找不到指定的方法或方法不是本地方法。            

jint UnregisterNatives (JNIEnv *env, jclass clazz);
“`
* 功能:
取消註冊類的本地方法。類將返回到連結或註冊了本地方法函式前的狀態.該函式不應在常規平臺相關程式碼中使用。相反,它可以為某些程式提供一種重新載入和重新連結本地庫的途徑。
* 引數:
env:JNI 介面指標。
clazz:Java 類物件。
* 返回值: 成功時返回“0”;失敗時返回負數。

相關推薦

Android JNI 介面總結

JNI Reference Exmaple 在寫android NDK的時候常常用到的一些JNI API的總結(參考官方文件:JNI API) 常用的操作類 jclass DefineClass(JNIEnv *env, jobject loader,

Android JNI使用總結(二)

上一篇裡面主要是JNI中一些函式的介紹,這篇部落格就舉個例子來說明這些函式的使用方法。 專案介紹 這個例子來源於我實際的專案。這段程式碼的作用是: 通過Uart傳送訊息; 接受Uart傳送過來的訊息; 因為這裡的主要目的不是說明如何使用uart,

Android下如何通過JNI方法向上提供介面總結

1 什麼是JNI JNI是Java Native Interface的縮寫,即Java本地介面.從Java1.1開始,JNI標準成為Java平臺的一部分,它允許java程式碼和用其它語言編寫的程式碼進行互動.JNI是本地程式設計介面,它使得在Java虛擬機

Android JNI 學習(四):JNI 介面整理 — 方法表 & Base Api & Exception Api

本文我們來總結一下JNI 提供的功能列表及相關的函式表。 注意:請注意使用術語“必須”來描述對JNI程式設計師的限制。例如,當您看到某個JNI函式必須接收非NULL物件時,您有責任確保不將NULL傳遞給該JNI函式。因此,JNI實現不需要在該JNI函式中執行NULL指標檢查。 一、介面方法表 可以通過J

Android JNI 學習(六):JNI 介面整理 — Object Operations Api

一、AllocObject jobjectAllocObject(JNIEnv *env, jclass clazz); 分配新 Java 物件而不呼叫該物件的任何建構函式。返回該物件的引用。 clazz 引數務必不要引用陣列類。 引數: env:JNI 介面指標。 clazz:Java

Android JNI 學習(七):JNI 介面整理 — Accessing Fields Api

一、GetFieldID jfieldIDGetFieldID(JNIEnv *env, jclass clazz, const char *name, const char *sig); 返回類的例項(非靜態)域的域 ID。該域由其名稱及簽名指定。訪問器函式的Get<type>F

Android NDK(JNI)學習總結一:Java程式碼中申明native函式-Java呼叫C函式,並在C函式中訪問java類和方法、屬性

本文不涉及android-ndk開發環境搭。 步驟一:新建一個APP,名稱為HelloJNI,然後定義一個類(將會在native程式碼中呼叫和訪問該類): package com.example.hellojni; public class JNITe

Android基礎學習總結(十六)——基於ijkplayer封裝支援簡單介面UI定製的視訊播放器

前言 專案開發中遇到需要解析播放m3u8視訊流的情況,但是原生的PlayerView非常慢,使用起來複雜,不適合上手,這裡找到一款ijkplayer是Bilibili基於ffmpeg開發並開源的輕量級視訊播放器,支援播放本地網路視訊,也支援流媒體播放。支援An

深入瞭解android平臺的jni---使用巨集定義精簡JNI介面函式名稱

深入瞭解android平臺的jni—使用巨集定義精簡JNI介面函式名稱 (2014-07-01 18:33:01)轉載▼ 標籤: android jni 巨集定義 分類: android 精簡JNI介面函式名稱 生成java的本地方法一般是通過如下步驟完成

AndroidJni學習總結--Jni中列印log資訊

一、在jni中c++層進行log的列印 1、在需要使用log的cpp檔案中加入 #include <android/log.h> 2、在需要列印的地方直接呼叫 __android_log_print(ANDROID_LOG_INFO,"test","value is %

Android Native新增JNI介面例項

diff --git a/frameworks/av/media/mtp/MtpServer.cpp b/frameworks/av/media/mtp/MtpServer.cpp index 31c3ecf..a0b4b77 100644 --- a/frameworks/av/media/mtp/MtpS

Android 中使用 JNI總結

方式 都是 edi urn 限定 ext powers shared 註冊 最近在研究 Android 相機相關的東西,因為想要對相機做一個封裝,於是想到要提供支持濾鏡和圖像動態識別相關的接口。在我找到一些資料中,它們的實現:一個是基於 OpenGL 的,一個是基於 Ope

Android JNI和NDK學習(09)--JNI實例二 傳遞類對象

get state 回調 obj utf 說明 called [] code 1 應用層代碼 NdkParam.java是JNI函數的調用類,它的代碼如下: package com.skywang.ndk; import android.app.Activity;

Android NDK 開發總結

設置 .text nbsp def runt 編寫 abi 文件的 targe 一.安裝配置環境 1.安裝Android Studio,下載路徑https://developer.android.com/studio/index.html?hl=zh-cn。我下載的是Win

Android jni/ndk編程三:native訪問java

efi pan exp exc save protect uil arm 註冊方法 一.訪問靜態字段 Java層的field和method,不管它是public,還是package、private和protected,從 JNI都可以訪問到,Java面向語言的封裝性不見了。

Android Jni層 創建 linux socket 出錯問題解決

res html true bsp 失敗 ica ins moni name 問題: 想在Jni層創建 udp socket 與服務端通信,可是沒有成功。最後發現居然是創建socket失敗(代碼例如以下) // create socket g_sd = soc

Android LBS 學習總結

知識 開發 try 同時 其他 nav service 需要 編程 LBS功能很好很強大,基於此能做很多有意義的軟件。 知識更新很快,看最新的教材,看最新的帖子。 多看第一手官方文檔,最權威,效率最高。 知識點梳理: LBS :location based se

aNDROID:HaNDLER學習總結

總結 5% andro baidu roi and handle usb list aNDROIDUsB%E9%A9%B1%E5%8A%A8%E7%A8%8B%E5%BA%8F%E5%BC%80%E5%8F%91 http://music.hao123.com/songl

Android JNI之靜態註冊

gen 返回 machine 當前 方法 jnicall ica nature javah 這篇說靜態註冊,所謂靜態註冊,就是native的方法是直接通過方法名的規定格式和Java端的聲明處代碼對應起來的,對於規則如下: JNIEXPORT <返回值> JNI

Android JNI之數據類型

vm t mit com ges tablet 類型 sig 完成 靜態註冊 JNI中數據類型的意義在於橋接Java數據類型與C數據類型。 簡單數據類型: Java Type Native Type Description boolean jbool