Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 高級開發 >> Android JNI開發進階篇

Android JNI開發進階篇

編輯:高級開發

 今天android123主要講解下昨天需要詳細說明有關Java JNI相關的異常處理、線程安全問題,在JNI中產生的異常主要是內存不足OutOfMemoryError、數組越界ArrayIndexOutOfBoundsException、數組賦值類型錯誤ArrayStoreException以及指針越界等問題。簡單的我們昨天在 android JNI開發提高篇中已經講到。

除了Throw或ThrowNew來拋出異常外,還提供了5個函數來處理,分別為jthrowable ExceptionOccurred(JNIEnv *env);、void ExceptionDescribe(JNIEnv *env);、void ExceptionClear(JNIEnv *env); 、 jboolean (JNIEnv *env) 和void FatalError(JNIEnv *env, const char *msg);

1. ExceptionCheck 用於檢測如果一個異常已經拋出,則該方法將會返回JNI_TRUE就是typedef定義為1的布爾值。

2. ExceptionOccurred 獲取正在拋出一個異常的本地引用,Native或Java層必須處理該異常,並返回一個jthrowable對象。

3. ExceptionDescribe主要用於打印出異常的錯誤描述。

4. ExceptionClear清除剛剛拋出的異常。

5. FatalError 的作用比較特殊,產生一個致命性的錯誤,android123提示這樣會導致JVM將關閉,就是程序停止運行了,所以使用時要謹慎。

我們以C++的代碼做個例子,簡單的說明下他們的使用方法

env->FindClass("android123CWJ"); //假設這個類本身不存在
if(env->ExceptionCheck())
{
env->ExceptionDescribe();
env->ExceptionClear();
}

這樣JVM因為查找android123CWJ類不存在,導致了一個NoClassDefFoundError的異常。

在JNI中處理資源同步問題,JNI提供了一組函數分別為jint MonitorEnter(JNIEnv *env, jobject obj); 和 jint MonitorExit(JNIEnv *env, jobject obj); 方法,類似一個簡單的同步鎖,在Java中我們這樣寫

synchronized (obj) {
//DOSomething
}

在JNI中,我們使用這組函數這樣寫

(*env)->MonitorEnter(obj);
//DOSomething
(*env)->MonitorExit(obj);

明天android開發網繼續講解JNI相關的內容,詳細說明下JNI中Java類的構造,查找以及方法和字段的訪問等知識,希望有空的網友先了解下Java的反射以及動態代理相關知識這樣可以更好的理解我們的最後一節 android JNI開發高級篇有關的內容。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved