1. 程式人生 > >Android JNI丟擲異常處理

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類或其它子類的例項。當一個方法出現異常後便丟擲一個異常物件,該物件中包含有異常資訊,呼叫這個物件的方法可以捕獲到這個異常並進行