Android JNI丟擲異常處理
為了從JNI中丟擲一個java異常,首先,使用FindClass()找到對應的類(像使用java的反射API);這裡通過JNI提供的機制,很好的介紹了java的回撥。在JNI中使用指定的jcalss來表示引用的java類。這裡使用jclass型別來描述一個異常例項,並在當前類載入器中通過完整名稱(包含包路徑)來搜尋類描述符。此外,我們不長時間需要引用異常類時,可以使用DeleteLocalRef()來解除引用。
注意:不要忘記處理返回值;
FindClass()和JNI方法可能會失敗的原因如下:沒有足夠的可用記憶體、類沒有找到等等
一旦異常丟擲,就不會呼叫JNI異常清理方法(DeleteLocalRef()、DeleteGlobalRef()等等)。原生代碼將清理它的資源並將控制交給後面的java,如果沒有java被呼叫,它可能執行本地處理(native process)。當被地方法返回時,異常被VM傳遞給JAVA。
如果其他地方不需要再使用時,需要刪除本地引用(指向類描述符)。當JNI借給你東西時,不要忘記還回去。
1、實現一個java異常類(InvalidTypeException.java)
public class InvalidTypeException extends Exception {
public InvalidTypeException(String pDetailMessage){
super(pDetailMessage);
}
}
2、在java的JNI介面類中指定丟擲異常()
public class Store {
static {
System.loadLibrary("store");
}
public native int getInteger(String pKey)
throws NotExistingKeyException, InvalidTypeException; //指定丟擲兩個異常
}
3、在java中處理丟擲的異常資訊
try{
if(sItem == "Integer") {
mUIValueEdit.setText( Integer.toString(mStore.getInteger(lKey)) );
}
else if (sItem == "String"){
mUIValueEdit.setText( mStore.getString(lKey) );
}
}
catch(NotExistingKeyException eNotExistingKeyException){
displayError("Key does not exist in Store");
}
catch(InvalidTypeException eInvalidTypeException){
displayError("錯誤的資料型別");
}
Java中的異常處理已經完成,現在我們可以在JNI中來丟擲上面定義的異常。
4、JNI中實現一個異常丟擲方法
void throwInvalidTypeException(JNIEnv* pEnv)
{
jclass lClass = (*pEnv)->FindClass(pEnv,“com/packtpub/exception/InvalidTypeException”);
if (lClass != NULL) {
(*pEnv)->ThrowNew(pEnv, lClass, “Invalid Type.”);
}
//如果我們長時間不再需要引用這個異常類時,可以使用DeleteLocalRef()來解除它。
(*pEnv)->DeleteLocalRef(pEnv, lClass);
}
5、JNI中呼叫4中的方法,丟擲異常
int32_t isEntryValid(JNIEnv* pEnv, StoreEntry* pEntry, StoreType pType)
{
if (pEntry->mType != pType) {
throwInvalidTypeException(pEnv); //丟擲異常
}
else {
return 1;
}
return 0;
}
相關推薦
Android JNI丟擲異常處理
為了從JNI中丟擲一個java異常,首先,使用FindClass()找到對應的類(像使用java的反射API);這裡通過JNI提供的機制,很好的介紹了java的回撥。在JNI中使用指定的jcalss來表示引用的java類。這裡使用jclass型別來描述一個異常例項,並在當前
c語言丟擲異常處理程式碼
try catch在java和c++中是有現成實現的,但是在c語言中是買有的,下面實現是來自網路上其他人提供的巨集定義方法,該方法有一定的侷限性,但是也有不少啟發。 下面是一段例子程式碼,需要使用的人可以自行修改。 #include <stdio.h> #in
Android:java 丟擲異常throw與throws以及捕捉異常try、catch、finally學習
二、培養好的程式設計習慣1.在寫程式時,對可能會出現異常的部分通常要用try{...}catch{...}去捕捉它並對它進行處理;2.用try{...}catch{...}捕捉了異常之後一定要對在catch{...}中對其進行處理,那怕是最簡單的一句輸出語句,或棧輸入e.printStackTrace();3
stack 處理 pop時丟擲異常
leetcode 20 :https://leetcode.com/problems/valid-parentheses/description/ 如果 stack 為空時,pop()會 丟擲exception, 處理的方法如下: try { char top = st.pop(); if (!
java 異常處理之宣告丟擲異常
java 異常處理宣告丟擲異常 2.宣告丟擲異常是Java中處理異常的第二種方式 2.宣告丟擲異常是Java中處理異常的第二種方式 如果一個方法(中的語句執行時)可能生成某種異常,但是並不能確定如何處理這種異常,則此方
丟擲自定義的異常,異常處理中丟擲異常
你可以用raise語句來引發一個異常。異常/錯誤物件必須有一個名字,且它們應是Error或Exception類的子類 下面是一個引發異常的例子: class ShortInputException(Exception): ‘’‘自定義的異常類’’’ def init(self, le
c++類比python 學習(遍歷列表、異常處理、丟擲異常)
遍歷列表 for i in list: print i c++11 的特性 1、這種情況是改變i的值並不改變vector,相當於只讀型別,淺拷貝 for(int i:vector) //
Java中父類和子類丟擲異常的處理
(尊重勞動成果,轉載請註明出處:https://blog.csdn.net/qq_25827845/article/details/85109390冷血之心的部落格) 背景: 這篇部落格的靈感來自
JAVA 內層方法丟擲異常 外層方法捕捉並處理異常
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興! 這是一篇有關JAVA:內層方法丟擲異常,外層方法捕捉並處理異常的文章資訊。我釋出到報名線上EDU84.COM上,和大家分享一下JAVA:內層方法丟擲異常,外層方
Java異常處理中try{}catch丟擲異常,後面程式碼還會繼續執行麼?
這張圖片上面顯示的程式碼執行之後將會輸出什麼?我們可以發現在procedure()函式結束之後函式後面的內容就不運行了,而主函式裡面的程式還是會繼續執行。反過來再測試如果先發生主函式裡面的異常那麼Pr
在Android M及更高版本中使用 Settings.System 丟擲異常"You cannot keep your settings in the secure settings. "
最近專案需要從Android L遷移到Android M。在升級的過程中,遇到了如下的問題。 在專案中,有一些公共的資料是存放在存放在 系統資料庫SettingsProvider的System表中 在Android L中的使用方法是: 當需要寫資料時呼叫: Sett
JAVA語言如何進行異常處理,關鍵字:throws,throw,try,catch,finally分別代表什麼意義?在try塊中可以丟擲異常嗎?
Java通過面向物件的方法進行異常處理,把各種不同的異常進行分類,並提供了良好的介面。 在Java中,每個異常都是一個物件,它是Throwable類或其它子類的例項。當一個方法出現異常後便 丟擲一個異常物件,該物件中包含有異常資訊,呼叫這個物件的方法可以捕獲到這個異常
Python_day11--異常處理(捕獲異常、丟擲異常)
一、丟擲一個錯誤碼在程式執行的過程中,如果發生了錯誤,可以事先約定返回一個錯誤程式碼,這樣,就可以知道是否有錯,以及出錯的原因。在作業系統提供的呼叫中,返回錯誤碼非常常見。比如開啟檔案的函式 open() ,成功時返回檔案描述符(就是一個整數),出錯時返回
Java語言如何進行異常處理,關鍵字:throws、throw、try、catch、finally分別代表什麼意義?在try塊中可以丟擲異常嗎?
try塊表示程式正常的業務執行程式碼。如果程式在執行try塊的程式碼時出現了“非預期”情況,JVM將會生成一個異常物件,這個異常物件將會被後面相應的catch塊捕獲。 catch塊表示一個異常捕獲塊。
JAVA 語言如何進行異常處理,關鍵字:throws,throw,try,catch,finally 分別代表什麼意義?在 try 塊中可以丟擲異常嗎?
Java 通過面向物件的方法進行異常處理,把各種不同的異常進行分類,並 提供了良好的介面。在 Java 中,每個異常都是一個物件,它是 Throwable 類或 其它子類的例項。當一個方法出現異
對std::out_of_range丟擲異常進行處理
#include <iostream> #include <vector> #include <stdexcept> usingnamespace std; int main() { vector <int> a; a.push
異常處理&&丟擲異常
異常處理機制: try…..except…..finally….. try: # 需要捕獲異常的程式碼塊, 必須執行, 如果遇到異常, 調轉到excepct語句; # 如果異常能被except後面的Error捕獲, 執行except語句的內
編寫一個Cirle類,包括構造方法,求圓的面積和周長,如果圓的半徑小於0則丟擲異常,讓使用者必須處理,半徑必須大於0才可以
public class Circle{private double radios;public Circle() {super();// TODO Auto-generated constructor stub}public Circle(double radios) {super();this.radio
JAVA:內層方法丟擲異常 外層方法捕捉並處理異常
這是一篇有關JAVA:內層方法丟擲異常,外層方法捕捉並處理異常的文章資訊。我釋出到報名線上EDU84.COM上,和大家分享一下JAVA:內層方法丟擲異常,外層方法捕捉並處理異常public void methodA (){ try{ // 呼叫methodB methodB
JAVA語言如何進行異常處理,關鍵字:throws,throw,try,catch,finally分別代表什麼意義?在try塊中可以丟擲異常嗎
Java通過面向物件的方法進行異常處理,把各種不同的異常進行分類,並提供了良好的介面。在Java中,每個異常都是一個物件,它是Throwable類或其它子類的例項。當一個方法出現異常後便丟擲一個異常物件,該物件中包含有異常資訊,呼叫這個物件的方法可以捕獲到這個異常並進行