JNI(2)

JNI(2)

訪問字段和方法

JNI容許本地代碼訪問java 對象的字段和方法。
調用須要兩個步驟:
例如調用cls類的f方法,
1. 獲取方法ID

jmethodID mid =      env->GetMethodID(cls, 「f」, 「(ILjava/lang/String;)D」);

2. 而後本地方法能夠重複的使用方法ID

jdouble result = env->CallDoubleMethod(obj, mid, 10, str);



報告編程錯誤

JNI 不會檢查編程錯誤,例如傳遞null指針或者非法的類型參數。 非法的類型參數包括使用普通對象代替類對象,JNI不檢查這些錯誤的緣由是:java

  •  檢查全部可能的錯誤會下降本地方法的性能
  •  在不少狀況下,沒有足夠多的運行時信息去作檢查
大部分的C庫都不會保證必定沒有編程錯誤。例如 printf()方法,當它接收到一個無效的地址時,致使運行時異常,而不是返回一個錯誤碼。


Java 異常

JNI容許本地方法拋出java 異常。本地方法也能夠處理java 異常以外的異常。沒有處理的java 異常會返回到VM。程序員


異常和錯誤代碼

JNI方法報告錯誤的方式:經過返回錯誤碼和拋出java 異常。
編程者能夠:
  • 根據最後一次JNI調用返回的值判斷時候發生了錯誤
  • 調用一個方法,獲取異常對象的詳細描述信息。
有兩種狀況,程序員檢查異常不能夠先檢查錯誤碼:
  • JNI調用java返回結果的方法。必須調用ExceptionOccurred()去檢查在java方法運行的時候可能產生的異常。
  • 一些JNI數組訪問方法不會返回錯誤碼。可是可能拋出ArrayIndexOutOfBoundsException或者ArrayStoreException.

異步異常

在多線程的狀況下,當前線程的線程可能會拋出異步異常。異步異常不會立刻影響在當前線程執行的本地方法,直到:
  • 本地方法調用JNI方法時,可以拋出異步異常,或者
  • 本地方法明確使用ExceptionOccurred()檢查同步和異步異常。

異常處理

在本地方法中有兩種方式能夠處理異常:編程

  • 本地方能夠拋出java異常
  • 本地方法能夠調用ExceptionClear()清楚異常,而後執行本身的異常處理。
當一個異常拋出,本地代碼必須先清除異常,而後才能調用其餘的JNI方法。當有一個掛起的異常時,JNI方法能夠安全的調用:
ExceptionOccurred()
  ExceptionDescribe()
  ExceptionClear()
  ExceptionCheck()
  ReleaseStringChars()
  ReleaseStringUTFChars()
  ReleaseStringCritical()
  Release<Type>ArrayElements()
  ReleasePrimitiveArrayCritical()
  DeleteLocalRef()
  DeleteGlobalRef()
  DeleteWeakGlobalRef()
  MonitorExit()
  PushLocalFrame()
  PopLocalFrame()
本站公眾號
   歡迎關注本站公眾號,獲取更多信息