1. 程式人生 > >Android jni開發-3(jni函式詳解)

Android jni開發-3(jni函式詳解)


JNI函式

    本章為JNI函式提供參考資訊。其中列出了全部JNI函式,同時也給出了JNI函式表的準確佈局。注意:“必須”一詞用於約束JNI程式設計人員。例如,當說明某個JNI函式必須接收非空物件時,就應確保不要向該JNI函式傳遞NULL值。這時,JNI實現將無需在該JNI函式中執行NULL指標檢查。

介面函式表

    每個函式均可通過JNIEnv引數以固定偏移量進行訪問。JNIEnv的型別是一個指標,指向儲存全部JNI函式指標的結構。注意:前三項留作將來與COM相容。此外,我們在函式表開頭部分也留出來多個NULL項,從而可將將來與類有關的JNI操作新增到FindClass後面,而非函式表的末尾。注意,函式表可在所有JNI介面指標間共享。

const struct JNINativeInterface ... = {
    NULL,
    NULL,
    NULL,
    NULL,
    GetVersion,

    DefineClass,
    FindClass,
    NULL,
    NULL,
    NULL,
    GetSuperclass,
    IsAssignableFrom,
    NULL,

    Throw,
    ThrowNew,
    ExceptionOccurred,
    ExceptionDescribe,
    ExceptionClear,
    FatalError,
    NULL
, NULL, NewGlobalRef, DeleteGlobalRef, DeleteLocalRef, IsSameObject, NULL, NULL, AllocObject, NewObject, NewObjectV, NewObjectA, GetObjectClass, IsInstanceOf, GetMethodID, CallObjectMethod, CallObjectMethodV, CallObjectMethodA, CallBooleanMethod, CallBooleanMethodV, CallBooleanMethodA, CallByteMethod, CallByteMethodV, CallByteMethodA, CallCharMethod, CallCharMethodV, CallCharMethodA, CallShortMethod, CallShortMethodV, CallShortMethodA, CallIntMethod, CallIntMethodV, CallIntMethodA, CallLongMethod, CallLongMethodV, CallLongMethodA, CallFloatMethod, CallFloatMethodV, CallFloatMethodA, CallDoubleMethod, CallDoubleMethodV, CallDoubleMethodA, CallVoidMethod, CallVoidMethodV, CallVoidMethodA, CallNonvirtualObjectMethod, CallNonvirtualObjectMethodV, CallNonvirtualObjectMethodA, CallNonvirtualBooleanMethod, CallNonvirtualBooleanMethodV, CallNonvirtualBooleanMethodA, CallNonvirtualByteMethod, CallNonvirtualByteMethodV, CallNonvirtualByteMethodA, CallNonvirtualCharMethod, CallNonvirtualCharMethodV, CallNonvirtualCharMethodA, CallNonvirtualShortMethod, CallNonvirtualShortMethodV, CallNonvirtualShortMethodA, CallNonvirtualIntMethod, CallNonvirtualIntMethodV, CallNonvirtualIntMethodA, CallNonvirtualLongMethod, CallNonvirtualLongMethodV, CallNonvirtualLongMethodA, CallNonvirtualFloatMethod, CallNonvirtualFloatMethodV, CallNonvirtualFloatMethodA, CallNonvirtualDoubleMethod, CallNonvirtualDoubleMethodV, CallNonvirtualDoubleMethodA, CallNonvirtualVoidMethod, CallNonvirtualVoidMethodV, CallNonvirtualVoidMethodA, GetFieldID, GetObjectField, GetBooleanField, GetByteField, GetCharField, GetShortField, GetIntField, GetLongField, GetFloatField, GetDoubleField, SetObjectField, SetBooleanField, SetByteField, SetCharField, SetShortField, SetIntField, SetLongField, SetFloatField, SetDoubleField, GetStaticMethodID, CallStaticObjectMethod, CallStaticObjectMethodV, CallStaticObjectMethodA, CallStaticBooleanMethod, CallStaticBooleanMethodV, CallStaticBooleanMethodA, CallStaticByteMethod, CallStaticByteMethodV, CallStaticByteMethodA, CallStaticCharMethod, CallStaticCharMethodV, CallStaticCharMethodA, CallStaticShortMethod, CallStaticShortMethodV, CallStaticShortMethodA, CallStaticIntMethod, CallStaticIntMethodV, CallStaticIntMethodA, CallStaticLongMethod, CallStaticLongMethodV, CallStaticLongMethodA, CallStaticFloatMethod, CallStaticFloatMethodV, CallStaticFloatMethodA, CallStaticDoubleMethod, CallStaticDoubleMethodV, CallStaticDoubleMethodA, CallStaticVoidMethod, CallStaticVoidMethodV, CallStaticVoidMethodA, GetStaticFieldID, GetStaticObjectField, GetStaticBooleanField, GetStaticByteField, GetStaticCharField, GetStaticShortField, GetStaticIntField, GetStaticLongField, GetStaticFloatField, GetStaticDoubleField, SetStaticObjectField, SetStaticBooleanField, SetStaticByteField, SetStaticCharField, SetStaticShortField, SetStaticIntField, SetStaticLongField, SetStaticFloatField, SetStaticDoubleField, NewString, GetStringLength, GetStringChars, ReleaseStringChars, NewStringUTF, GetStringUTFLength, GetStringUTFChars, ReleaseStringUTFChars, GetArrayLength, NewObjectArray, GetObjectArrayElement, SetObjectArrayElement, NewBooleanArray, NewByteArray, NewCharArray, NewShortArray, NewIntArray, NewLongArray, NewFloatArray, NewDoubleArray, GetBooleanArrayElements, GetByteArrayElements, GetCharArrayElements, GetShortArrayElements, GetIntArrayElements, GetLongArrayElements, GetFloatArrayElements, GetDoubleArrayElements, ReleaseBooleanArrayElements, ReleaseByteArrayElements, ReleaseCharArrayElements, ReleaseShortArrayElements, ReleaseIntArrayElements, ReleaseLongArrayElements, ReleaseFloatArrayElements, ReleaseDoubleArrayElements, GetBooleanArrayRegion, GetByteArrayRegion, GetCharArrayRegion, GetShortArrayRegion, GetIntArrayRegion, GetLongArrayRegion, GetFloatArrayRegion, GetDoubleArrayRegion, SetBooleanArrayRegion, SetByteArrayRegion, SetCharArrayRegion, SetShortArrayRegion, SetIntArrayRegion, SetLongArrayRegion, SetFloatArrayRegion, SetDoubleArrayRegion, RegisterNatives, UnregisterNatives, MonitorEnter, MonitorExit, GetJavaVM, };
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226
  • 227
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • 241
  • 242
  • 243
  • 244
  • 245
  • 246
  • 247

版本資訊

GetVersion( )返回本地方法介面的版本。

jint GetVersion(JNIEnv *env);
  • 1

引數 :
env為JNI介面指標

返回值:
高16位返回主版本號,低16位返回次版本號
在JDK1.1 中,GetVersion()返回0x00010001

類操作

DefineClass( )從原始類資料的緩衝區中載入類。

jclassDefineClass(JNIEnv *env, jobject loader, const jbyte *buf, jsize bufLen);
  • 1

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

返回值:
返回Java類物件如果出錯則返回NULL

丟擲的異常:
- ClassFormatError:如果類資料指定的類無效。
- ClassCircularityError:如果類或介面是自身的超類或超介面。
- OutOfMemoryError:如果系統記憶體不足。

FindClass( ) 該函式用於載入本地定義的類。它將搜尋由CLASSPATH環境變數為具有指定名稱的類所指定的目錄和zip檔案。

jclassFindClass(JNIEnv *env, const char *name);
  • 1

引數:
env:JNI介面指標。
name:類全名(即包名後跟類名,之間由“/”分隔)。如果該名稱以“[”(陣列簽名字元)打頭,則返回一個數組類。

返回值:
返回類物件全名。如果找不到該類,則返回NULL。

丟擲:
- ClassFormatError:如果類資料指定的類無效。
- ClassCircularityError:如果類或介面是自身的超類或超介面。
- NoClassDefFoundError:如果找不到所請求的類或介面的定義。
- OutOfMemoryError:如果系統記憶體不足。

GetSuperclass( ) 如果clazz代表類而非類object,則該函式返回由clazz所指定的類的超類。如果clazz指定類object或代表某個介面,則該函式返回NULL。

jclassGetSuperclass(JNIEnv *env, jclass clazz);
  • 1

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

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

IsAssignableFrom ( ) 確定clazz1的物件是否可安全地強制轉換為clazz2。

jboolean IsAssignableFrom(JNIEnv *env, jclassclazz1, jclassclazz2);
  • 1

引數:
env:JNI介面指標。
clazz1:第一個類引數。
clazz2:第二個類引數。

返回值:
下列某個情況為真時返回JNI_TRUE
第一及第二個類引數引用同一個Java類
第一個類是第二個類的子類
第二個類是第一個類的某個介面

異常

Throw( ) 丟擲java.lang.Throwable物件。

jint Throw(JNIEnv *env, jthrowable obj);
  • 1

引數:
env:JNI介面指標。
obj:java.lang.Throwable物件。

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

丟擲:
java.lang.Throwable物件obj

ThrowNew( )利用指定類的訊息(由message指定)構造異常物件並丟擲該異常。

jint ThrowNew(JNIEnv *env, jclass clazz, const char *message);
  • 1

引數:
env:JNI介面指標。
clazz:java.lang.Throwable的子類。
message:用於構造java.lang.Throwable物件的訊息。

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

丟擲:
新構造的java.lang.Throwable物件。

ExceptionOccurred( ) 確定是否某個異常正被丟擲。在平臺相關程式碼呼叫ExceptionClear()或Java程式碼處理該異常前,異常將始終保持丟擲狀態。

jthrowable ExceptionOccurred(JNIEnv *env);
  • 1

引數:
env:JNI介面指標。

返回值:
返回正被丟擲的異常物件,如果當前無異常被丟擲,則返回NULL

ExceptionDescribe( ) 將異常及堆疊的回溯輸出到系統錯誤報告通道(例如 stderr)。該例程可便利除錯操作。

void ExceptionDescribe(JNIEnv *env);
  • 1

引數:
env:JNI介面指標。

ExceptionClear( ) 清除當前丟擲的任何異常。如果當前無異常,則此例程不產生任何效果。

void ExceptionClear(JNIEnv *env);
  • 1

引數:
env:JNI介面指標。

FatalError( )丟擲致命錯誤並且不希望虛擬機器進行修復。該函式無返回值。

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

引數:
env:JNI介面指標。
msg:錯誤訊息。

全域性及區域性引用

NewGlobalRef( ) 建立obj引數所引用物件的新全域性引用。obj引數既可以是全域性引用,也可以是區域性引用。全域性引用通過呼叫DeleteGlobalRef()來顯式撤消。

jobjectNewGlobalRef(JNIEnv *env, jobject obj);
  • 1

引數:
env:JNI介面指標。
obj:全域性或區域性引用。

返回值:
返回全域性引用。如果系統記憶體不足則返回NULL

DeleteGlobalRef( ) 刪除globalRef所指向的全域性引用。

void DeleteGlobalRef(JNIEnv *env, jobjectglobalRef);
  • 1

引數:
env:JNI介面指標。
globalRef:全域性引用。

DeleteLocalRef( ) 刪除localRef所指向的區域性引用。

void DeleteLocalRef(JNIEnv *env, jobjectlocalRef);
  • 1

引數:
env:JNI介面指標。
localRef:區域性引用。

物件操作

AllocObject( ) 分配新Java物件而不呼叫該物件的任何建構函式。返回該物件的引用。clazz引數務必不要引用陣列類。

jobjectAllocObject(JNIEnv *env, jclass clazz);
  • 1

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

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

丟擲:
InstantiationException:如果該類為一個介面或抽象類
OutOfMemoryError:如果系統記憶體不足

NewObject( ) NewObjectA( ) NewObjectV( ) 構造新Java物件。

jobject NewObject(JNIEnv *env, jclass clazz, jmethodID methodID, ...);
jobject NewObjectA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args);
jobject NewObjectV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
  • 1
  • 2
  • 3

方法ID指示應呼叫的建構函式方法。該ID必須通過呼叫GetMethodID( )獲得,且呼叫時的方法名必須為init,而返回型別必須為void(V)。clazz引數務必不要引用陣列類。

NewObject( )
程式設計人員應將傳遞給建構函式的所有引數緊跟著放在methodID引數的後面。NewObject( )收到這些引數後,將把它們傳給程式設計人員所要呼叫的Java方法。

NewObjectA( )
程式設計人員應將傳遞給建構函式的所有引數放在jvalues型別的陣列args中,該陣列緊跟著放在methodID引數的後面。NewObject()收到陣列中的這些引數後,將把它們傳給程式設計人員所要呼叫的Java方法。

NewObjectV( )
程式設計人員應將傳遞給建構函式的所有引數放在va_list型別的引數args中,該引數緊跟著放在methodID引數的後面。NewObject()收到這些引數後,將把它們傳給程式設計人員所要呼叫的Java方法。

引數:
env:JNI介面指標。
clazz:Java類物件。
methodID:建構函式的方法ID。

NewObject 的其它引數:
傳給建構函式的引數。

NewObjectA的其它引數:
args:傳給建構函式的引數陣列

NewObjectV的其它引數:
args:傳給建構函式的引數va_list

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

丟擲:
InstantiationException:如果該類為介面或抽象類
OutOfMemoryError:如果系統記憶體不足

建構函式丟擲的任何異常。

GetObjectClass( ) 返回物件的類。

jclassGetObjectClass(JNIEnv *env, jobject obj);
  • 1

引數:
env:JNI介面指標。
obj:Java物件(不能為NULL)。

返回值:
返回Java類物件

IsInstanceOf( ) 測試物件是否為某個類的例項。

jboolean IsInstanceOf(JNIEnv *env, jobjectobj, jclassclazz);
  • 1

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

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

IsSameObject( ) 測試兩個引用是否引用同一Java物件。

jboolean IsSameObject(JNIEnv *env, jobjectref1, jobjectref2);
  • 1

引數:
env:JNI介面指標。
ref1:Java物件。
ref2:Java物件。

返回值:
如果ref1和ref2引用同一Java物件或均為NULL,則返回JNI_TRUE。否則返回JNI_FALSE

訪問物件的域

GetFieldID( )

jfieldID GetFieldID(JNIEnv *env, jclass clazz, const char *name, const char *sig);
  • 1

返回類的例項(非靜態)域的域ID。該域由其名稱及簽名指定。訪問器函式的Get[type]FieldSet[type]Field系列使用域ID檢索
物件域。GetFieldID( )將未初始化的類初始化。GetFieldID( )不能用於獲取陣列的長度域。應使GetArrayLength( )

引數:
env:JNI介面指標。
clazz:Java類物件。
name: 0終結的UTF-8字串中的域名。
sig:0終結的UTF-8字串中的域簽名。

返回值:
域ID。如果操作失敗,則返回NULL。

丟擲:
NoSuchFieldError:如果找不到指定的域
ExceptionInInitializerError:如果由於異常而導致類初始化程式失敗
OutOfMemoryError:如果系統記憶體不足

Get[type]Field例程

NativeType Get[type]Field(JNIEnv *env, jobjectobj, jfieldIDfieldID);
  • 1

該訪問器例程系列返回物件的例項(非靜態)域的值。要訪問的域由通過呼叫GetFieldID( )而得到的域ID指定。

引數:
env:JNI介面指標。
obj:Java物件(不能為 NULL)。
fieldID:有效的域ID。

返回值:
域的內容

下表說明了Get[type]Field例程名及結果型別。應將Get[type]Field中的type替換為域的Java型別(或使用表中的某個實際例程名),然後將NativeType替換為該例程對應的本地型別。

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, jobjectobj, jfieldIDfieldID, NativeTypevalue);
  • 1

該訪問器例程系列設定物件的例項(非靜態)域的值。要訪問的域由通過呼叫SetFieldID( )而得到的域ID指定。

引數:
env:JNI介面指標。
obj:Java物件(不能為NULL)。
fieldID:有效的域ID。
value:域的新值。

下表說明了Set[type]Field例程名及結果型別。應將Set[type]Field中的type替換為域的Java型別(或使用表中的某個實際例程名),然後將NativeType替換為該例程對應的本地型別。

Set[type]Field例程名 本地型別
Set[type]Field例程名 本地型別
SetObjectField( ) jobject
SetBooleanField( ) jboolean
SetByteField( ) jbyte
SetCharField( ) jchar
SetShortField( ) jshort
SetIntField( ) jint
SetLongField( ) jlong
SetFloatField( ) jfloat
SetDoubleField( ) jdouble

呼叫例項方法

GetMethodID( )

jmethodID GetMethodID(JNIEnv *env, jclass clazz, const char *name, const char *sig);
  • 1

返回類或介面例項(非靜態)方法的方法ID。方法可在某個clazz的超類中定義,也可從clazz繼承。該方法由其名稱和簽名決定。GetMethodID( )可使未初始化的類初始化。要獲得建構函式的方法ID,應將[init]作為方法名,同時將void (V)作為返回型別。

引數:
env:JNI介面指標。
clazz:Java類物件。
name:0終結的UTF-8字串中的方法名。
sig:0終結的UTF-8字串中的方法簽名。

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

丟擲:
NoSuchMethodError:如果找不到指定方法
ExceptionInInitializerError:如果由於異常而導致類初始化程式失敗
OutOfMemoryError:如果系統記憶體不足

Call[type]Method( ),Call[type]MethodA( ),Call[type]MethodV( )例程

NativeType Call[type]Method(JNIEnv *env, 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);
  • 1
  • 2
  • 3

這三個操作的方法用於從本地方法呼叫Java例項方法。它們的差別僅在於向其所呼叫的方法傳遞引數時所用的機制。這三個操作將根據所指定的方法ID呼叫Java物件的例項(非靜態)方法。引數methodID必須通過呼叫GetMethodID( )來獲得。當這些函式用於呼叫私有方法和建構函式時,方法ID必須從obj的真實類派生而來,而不應從其某個超類派生。

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

Call[type]Method例程的其它引數:
要傳給Java方法的引數

Call[type]MethodA例程的其它引數:
args:引數陣列

Call[type]MethodV例程的其它引數:
args:引數的va_list

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

丟擲:
執行Java方法時丟擲的異常
Call[type]Method例程

程式設計人員應將要傳給方法的所有引數緊跟著放在methodID引數之後。Call[type]Method例程接受這些引數並將其傳給程式設計人員所要呼叫的Java方法。

Call[type]MethodA例程

程式設計人員應將要傳給方法的所有引數放在緊跟在methodID引數之後的jvalues型別陣列args中。Call[type]MethodA routine接受這些陣列中的引數並將其傳給程式設計人員所要呼叫的Java方法。

Call[type]MethodV 例程

程式設計人員將方法的所有引數放在緊跟著在methodID引數之後的va_list型別引數變數中。Call[type]MethodV routine接受這些引數並將其傳給程式設計人員所要呼叫的Java方法。

下表根據結果型別說明了各個方法呼叫例程。使用者應將Call[type]Method中的type替換為所呼叫方法的Java型別(或使用表中的實際方法呼叫例程名),同時將NativeType替換為該例程相應的本地型別。

Call[type]Method例程名 本地型別
CallVoidMethod( ) CallVoidMethodA( ) CallVoidMethodV( ) void
CallObjectMethod( ) CallObjectMethodA( ) CallObjectMethodV( ) jobject
CallBooleanMethod( ) CallBooleanMethodA() CallBooleanMethodV( ) jboolean
CallByteMethod( ) CallByteMethodA( ) CallByteMethodV( ) jbyte
CallCharMethod( ) CallCharMethodA( ) CallCharMethodV( ) jchar
CallShortMethod( ) CallShortMethodA( ) CallShortMethodV( ) jshort
CallIntMethod( ) CallIntMethodA( ) CallIntMethodV( ) jint
CallLongMethod( ) CallLongMethodA( ) CallLongMethodV( ) jlong
CallFloatMethod( ) CallFloatMethodA( ) CallFloatMethodV( ) jfloat
CallDoubleMethod( ) CallDoubleMethodA( ) CallDoubleMethodV( ) jdouble

CallNonvirtual[type]Method,CallNonvirtual[type]MethodA,CallNonvirtual[type]MethodV例程

NativeType CallNonvirtual[type]Method(JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
NativeType CallNonvirtual[type]MethodA(JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args);
NativeType CallNonvirtual[type]MethodV(JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args);
  • 1
  • 2
  • 3

這些操作根據指定的類和方法ID呼叫某Java物件的例項(非靜態)方法。引數methodID必須通過呼叫clazz類的GetMethodID( )獲得。CallNonvirtual[type]Method和Call[type]Method例程系列並不相同。Call[type]Method例程根據物件的類呼叫方法,而CallNonvirtual[type]Method例程則根據獲得方法ID的(由clazz引數指定)類呼叫方法。方法ID必須從物件的真實類或其某個超類獲得

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

CallNonvirtual[type]Method例程的其它引數:
要傳給Java方法的引數

CallNonvirtual[type]MethodA例程的其它引數:
args:引數陣列

CallNonvirtual[type]MethodV例程的其它引數:
args:引數的va_list

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

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

CallNonvirtual[type]Method例程

程式設計人員應將要傳給方法的所有引數緊跟著放在methodID引數之後。CallNonvirtual[type]Method routine接受這些引數並將其傳給程式設計人員所要呼叫的Java方法。

CallNonvirtual[type]MethodA例程

程式設計人員應將要傳給方法的所有引數放在緊跟在methodID引數之後的jvalues型別陣列args中。
CallNonvirtual[type]MethodA routine接受這些陣列中的引數並將其傳給程式設計人員所要呼叫的Java方法。

CallNonvirtual[type]MethodV例程

程式設計人員應將要傳給方法的所有引數放在緊跟在methodID引數之後的va_list型別引數args中。CallNonvirtualMethodV routine接受這些引數並將其傳給程式設計人員所要呼叫的Java方法。

下表根據結果型別說明了各個方法呼叫例程。使用者應將CallNonvirtual[type]Method中的type替換為所呼叫方法的Java型別(或使用表中的實際方法呼叫例程名),同時將NativeType替換為該例程相應的本地型別。

CallNonvirtual[type]Method例程名 本地型別
CallNonvirtualVoidMethod( ) CallNonvirtualVoidMethodA( ) CallNonvirtualVoidMethodV( ) void
CallNonvirtualObjectMethod( ) CallNonvirtualObjectMethodA( ) CallNonvirtualObjectMethodV( ) jobject
CallNonvirtualBooleanMethod( ) CallNonvirtualBooleanMethodA( ) CallNonvirtualBooleanMethodV( ) jboolean
CallNonvirtualByteMethod( ) CallNonvirtualByteMethodA( ) CallNonvirtualByteMethodV( ) jbyte
CallNonvirtualCharMethod( ) CallNonvirtualCharMethodA( ) CallNonvirtualCharMethodV( ) jchar
CallNonvirtualShortMethod( ) CallNonvirtualShortMethodA( ) CallNonvirtualShortMethodV( )
CallNonvirtualIntMethod( ) CallNonvirtualIntMethodA( ) CallNonvirtualIntMethodV( ) jint
CallNonvirtualLongMethod( ) CallNonvirtualLongMethodA( ) CallNonvirtualLongMethodV( ) jlong
CallNonvirtualFloatMethod( ) CallNonvirtualFloatMethodA( ) CallNonvirtualFloatMethodV( ) jfloat
CallNonvirtualDoubleMethod( ) CallNonvirtualDoubleMethodA( ) CallNonvirtualDoubleMethodV( ) jdouble

訪問靜態域

GetStaticFieldID( )

jfieldID GetStaticFieldID(JNIEnv *env, jclass clazz, const char *name, const char *sig);
  • 1

返回類的靜態域的域ID。域由其名稱和簽名指定。GetStatic[type]Field和SetStatic[type]Field訪問器函式系列使用域ID檢索靜態域。GetStaticFieldID()將未初始化的類初始化。

引數:
env:JNI介面指標。
clazz:Java類物件。
name: 0終結的UTF-8字串中的靜態域名。
sig:0終結的UTF-8字串中的域簽名。

返回值:
域ID。如果找不到指定的靜態域,則為NULL
丟擲:
NoSuchFieldError:如果找不到指定的靜態域
ExceptionInInitializerError:如果由於異常而導致類初始化程式失敗
OutOfMemoryError:如果系統記憶體不足

GetStatic[type]Field例程

NativeType GetStatic[type]Field(JNIEnv *env, jclassclazz, jfieldIDfieldID);
  • 1

該訪問器例程系列返回物件的靜態域的值。要訪問的域由通過呼叫GetStaticFieldID()而得到的域ID指定。

引數:
env:JNI介面指標。
clazz:Java類物件。
fieldID:靜態域ID。

返回值:
靜態域的內容

下表說明了GetStatic[type]Field例程名及結果型別。應將GetStatic[type]Field中的type替換為域的Java型別(或使用表中的某個實際例程名),然後將NativeType替換為該例程對應的本地型別。

GetStatic[type]Field例程名 本地型別
GetStaticObjectField( ) jobject
GetStaticBooleanField( ) jboolean
GetStaticByteField( ) jbyte
GetStaticCharField( ) jchar
GetStaticShortField( ) jshort
GetStaticIntField( ) jint
GetStaticLongField( ) jlong
GetStaticFloatField( ) jfloat
GetStaticDoubleField( ) jdouble

SetStatic[type]Field例程

void SetStatic[type]Field(JNIEnv *env, jclassclazz, jfieldIDfieldID, NativeTypevalue);
  • 1

該訪問器例程系列設定物件的靜態域的值。要訪問的域由通過呼叫GetStaticFieldID()而得到的域ID指定。

引數:
env:JNI介面指標。
clazz:Java類物件。
fieldID:靜態域ID。
value:域的新值。

下表說明了SetStatic[type]Field例程名及結果型別。應將SetStatic[type]Field中的type替換為域的Java型別(或使用表中的某個實際例程名),然後將NativeType替換為該例程對應的本地型別。

SetStatic[type]Field例程名 本地型別
SetStaticObjectField( ) jobject
SetStaticBooleanField( ) jboolean
SetStaticByteField( ) jbyte
SetStaticCharField( ) jchar
SetStaticShortField( ) jshort
SetStaticIntField( ) jint
SetStaticLongField( ) jlong
SetStaticFloatField( ) jfloat
SetStaticDoubleField( ) jdouble

呼叫靜態方法

GetStaticMethodID( ) 返回類的靜態方法的方法ID。方法由其名稱和簽名指定。GetStaticMethodID( )將未初始化的類初始化

jmethodID GetStaticMethodID(JNIEnv *env, jclass clazz, const char *name, const char *sig);
  • 1

引數:
env:JNI介面指標。
clazz:Java類物件。
name:0終結UTF-8字串中的靜態方法名。
sig:0終結UTF-8字串中的方法簽名。

返回值:
方法ID,如果操作失敗,則為NULL

丟擲:
NoSuchMethodError:如果找不到指定的靜態方法
ExceptionInInitializerError:如果由於異常而導致類初始化程式失敗
OutOfMemoryError:如果系統記憶體不足

CallStatic[type]Method,CallStatic[type]MethodA,CallStatic[type]MethodV( ) 例程

NativeType CallStatic[type]Method(JNIEnv *env, jclass clazz, jmethodID methodID, ...);
NativeType CallStatic[type]MethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args);
NativeType CallStatic[type]MethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
  • 1
  • 2
  • 3

這些操作將根據指定的方法ID呼叫Java物件的靜態方法。methodID引數必須通過呼叫GetStaticMethodID()得到。方法ID必須從clazz派生,而不能從其超類派生。

引數:
env:JNI介面指標。
clazz:Java類物件。
methodID:靜態方法ID。

CallStatic[type]Method例程的其它引數:
要傳給靜態方法的引數

CallStatic[type]MethodA例程的其它引數:
args:引數陣列

CallStatic[type]MethodV例程的其它引數:
args:引數的va_list

返回值:
返回呼叫靜態Java方法的結果

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

CallStatic[type]Method例程

程式設計人員應將要傳給方法的所有引數緊跟著放在methodID引數之後。CallStatic[type]Method routine接受這些引數並將其傳給程式設計人員所要呼叫的Java方法。

CallStatic[type]MethodA例程

程式設計人員應將要傳給方法的所有引數放在緊跟在methodID引數之後的jvalues型別陣列args中。CallStaticMethodA routine接受這些陣列中的引數並將其傳給程式設計人員所要呼叫的Java方法。

CallStatic[type]MethodV例程

程式設計人員應將要傳給方法的所有引數放在緊跟在methodID引數之後的va_list型別引數args中。CallStaticMethodV routine接受這些引數並將其傳給程式設計人員所要呼叫的Java方法。

下表根據結果型別說明了各個方法呼叫例程。使用者應將CallStatic[type]Method中的type替換為所呼叫方法的Java型別(或使用表中的實際方法呼叫例程名),同時將NativeType替換為該例程相應的本地型別。

CallStatic[type]Method例程名 本地型別
CallStaticVoidMethod( ) CallStaticVoidMethodA( ) CallStaticVoidMethodV( ) void
CallStaticObjectMethod( ) CallStaticObjectMethodA( ) CallStaticObjectMethodV( ) jobject
CallStaticBooleanMethod( ) CallStaticBooleanMethodA( ) CallStaticBooleanMethodV( ) jboolean
CallStaticByteMethod( ) CallStaticByteMethodA( ) CallStaticByteMethodV( ) jbyte
CallStaticCharMethod( ) CallStaticCharMethodA( ) CallStaticCharMethodV( ) jchar
CallStaticShortMethod( ) CallStaticShortMethodA( ) CallStaticShortMethodV( ) jshort
CallStaticIntMethod( ) CallStaticIntMethodA( ) CallStaticIntMethodV( ) jint
CallStaticLongMethod( ) CallStaticLongMethodA( ) CallStaticLongMethodV( ) jlong
CallStaticFloatMethod( ) CallStaticFloatMethodA( ) CallStaticFloatMethodV( ) jfloat
CallStaticDoubleMethod( ) CallStaticDoubleMethodA( ) CallStaticDoubleMethodV( ) jdouble

字串操作

NewString( ) 利用Unicode字元陣列構造新的java.lang.String物件。

jstring NewString(JNIEnv *env, const jchar *unicodeChars, jsize len);
  • 1

引數:
env:JNI介面指標。
unicodeChars:指向Unicode字串的指標。
len:Unicode字串的長度。

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

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

GetStringLength( ) 返回Java字串的長度(Unicode字元數)。

jsize GetStringLength(JNIEnv *env, jstring string);
  • 1

引數:
env:JNI介面指標。
string:Java字串物件。

返回值:
Java 字串的長度

GetStringChars( ) 返回指向字串的Unicode字元陣列的指標。該指標在呼叫ReleaseStringchars()前一直有效。如果isCopy非空,則在複製完成後將*isCopy設為JNI_TRUE。如果沒有複製,則設為JNI_FALSE。

const jchar * GetStringChars(JNIEnv *env, jstring string, jboolean *isCopy);
  • 1

引數:
env:JNI介面指