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]Field及Set[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介面指