閱讀160 返回首頁    go 阿裏雲 go 技術社區[雲棲]


《Java 本地接口規範》- JNI 函數(一)

JNI 函數


本章為 JNI 函數提供參考信息。其中列出了全部 JNI 函數,同時也給出了 JNI 函數表的準確布局。

注意:“必須”一詞用於約束 JNI 編程人員。例如,當說明某個 JNI 函數必須接收非空對象時,就應確保不要向該 JNI 函數傳遞 NULL。這時,JNI 實現將無需在該 JNI 函數中執行 NULL 指針檢查。

本章的部分資料改編自 Netscape 的 JRI 文檔。

該參考資料按用法對函數進行組織。參考部分按下列函數區域進行組織:


接口函數表

每個函數均可通過 JNIEnv 參數以固定偏移量進行訪問。JNIEnv 的類型是一個指針,指向存儲全部 JNI 函數指針的結構。其定義如下:

注意:前三項留作將來與 COM 兼容。此外,我們在函數表開頭部分也留出來多個 NULL 項,從而可將將來與類有關的 JNI 操作添加到 FindClass 後麵,而非函數表的末尾。

注意,函數表可在所有 JNI 接口指針間共享。

代碼示例 4-1

    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,
    };

版本信息

 

GetVersion

jintGetVersion(JNIEnv *env);

返回本地方法接口的版本。

參數

env:JNI 接口指針。

返回值:

高 16 位返回主版本號,低 16 位返回次版本號。

在 JDK1.1 中,GetVersion() 返回 0x00010001。


類操作

 

DefineClass

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

從原始類數據的緩衝區中加載類。

參數:

env:JNI 接口指針。

loader:分派給所定義的類的類加載器。

buf:包含 .class 文件數據的緩衝區。

bufLen:緩衝區長度。

返回值:

返回 Java 類對象。如果出錯則返回NULL

拋出:

ClassFormatError:如果類數據指定的類無效。

ClassCircularityError:如果類或接口是自身的超類或超接口。 

OutOfMemoryError:如果係統內存不足。

 

FindClass

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

該函數用於加載本地定義的類。它將搜索由CLASSPATH 環境變量為具有指定名稱的類所指定的目錄和 zip 文件。

參數:

env:JNI 接口指針。

name:類全名(即包名後跟類名,之間由“/”分隔)。如果該名稱以“[”(數組簽名字符)打頭,則返回一個數組類。

返回值:

返回類對象全名。如果找不到該類,則返回 NULL

拋出:

ClassFormatError:如果類數據指定的類無效。

ClassCircularityError:如果類或接口是自身的超類或超接口。

NoClassDefFoundError:如果找不到所請求的類或接口的定義。

OutOfMemoryError:如果係統內存不足。

 

GetSuperclass

jclassGetSuperclass(JNIEnv *env, jclass clazz);

如果 clazz 代表類而非類 object,則該函數返回由 clazz 所指定的類的超類。

如果 clazz 指定類 object 或代表某個接口,則該函數返回NULL

參數:

env:JNI 接口指針。

clazz:Java 類對象。

返回值:

clazz 所代表的類的超類或 NULL

 

IsAssignableFrom

jbooleanIsAssignableFrom(JNIEnv *env, jclass clazz1,
jclass clazz2);

確定 clazz1 的對象是否可安全地強製轉換為clazz2

參數:

env:JNI 接口指針。

clazz1:第一個類參數。

clazz2:第二個類參數。

返回值:

下列某個情況為真時返回 JNI_TRUE

  • 第一及第二個類參數引用同一個 Java 類。
  • 第一個類是第二個類的子類。
  • 第二個類是第一個類的某個接口。

異常

 

Throw

jintThrow(JNIEnv *env, jthrowable obj);

拋出 java.lang.Throwable 對象。

參數:

env:JNI 接口指針。

objjava.lang.Throwable 對象。

返回值:

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

拋出:

java.lang.Throwable 對象 obj

 

ThrowNew

jintThrowNew(JNIEnv *env, jclass clazz,
const char *message);

利用指定類的消息(由 message 指定)構造異常對象並拋出該異常。

參數:

env:JNI 接口指針。

clazzjava.lang.Throwable 的子類。

message:用於構造java.lang.Throwable 對象的消息。

返回值:

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

拋出:

新構造的 java.lang.Throwable 對象。

 

ExceptionOccurred

jthrowableExceptionOccurred(JNIEnv *env);

確定是否某個異常正被拋出。在平台相關代碼調用 ExceptionClear() 或 Java 代碼處理該異常前,異常將始終保持拋出狀態。

參數:

env:JNI 接口指針。

返回值:

返回正被拋出的異常對象,如果當前無異常被拋出,則返回NULL

 

ExceptionDescribe

voidExceptionDescribe(JNIEnv *env);

將異常及堆棧的回溯輸出到係統錯誤報告信道(例如 stderr)。該例程可便利調試操作。

參數:

env:JNI 接口指針。

 

ExceptionClear

voidExceptionClear(JNIEnv *env);

清除當前拋出的任何異常。如果當前無異常,則此例程不產生任何效果。

參數:

env:JNI 接口指針。

 

FatalError

voidFatalError(JNIEnv *env, const char *msg);

拋出致命錯誤並且不希望虛擬機進行修複。該函數無返回值。

參數:

env:JNI 接口指針。

msg:錯誤消息。


全局及局部引用

 

NewGlobalRef

jobjectNewGlobalRef(JNIEnv *env, jobject obj);

創建 obj 參數所引用對象的新全局引用。obj 參數既可以是全局引用,也可以是局部引用。全局引用通過調用 DeleteGlobalRef() 來顯式撤消。

參數:

env:JNI 接口指針。

obj:全局或局部引用。

返回值:

返回全局引用。如果係統內存不足則返回 NULL

 

DeleteGlobalRef

voidDeleteGlobalRef(JNIEnv *env, jobject globalRef);

刪除 globalRef 所指向的全局引用。

參數:

env:JNI 接口指針。

globalRef:全局引用。

 

DeleteLocalRef

voidDeleteLocalRef(JNIEnv *env, jobject localRef);

刪除 localRef所指向的局部引用。

參數:

env:JNI 接口指針。

localRef:局部引用。

最後更新:2017-04-02 06:52:01

  上一篇:go HierarchicalStateMachine(HandlerStateMachine)分析
  下一篇:go cctype <ctype.h> <cctype>