編輯:高級開發
三、在JNI中構造和實例化Java類
public class androidJniDemo4{
public static native void constructClass(); //JNI方法
public static void main(String[] args){
androidJniDemo4.constructClass();
}
}
class CwjThread implements Runnable {
int nCount = 0 ;
public void run(){
try{
Thread.sleep(1987); //休眠1987毫秒
}catch(Exception e){
e.printStackTrace();
}
System.out.println("Count="+ nCount);
}
}
JNIEXPORT void JNICALL
Java_androidJniDemo4_constructClass(JNIEnv *env, jclass clazz){
jclass jclazz , cwjclazz;
jmethodID mid , mid2 , runmid ;
jobject obj , obj2 ;
jclazz = (*env)->FindClass(env, "CwjThread"); //查找Java層的類
if (jclazz == NULL)
{
return ;
}
mid = (*env)->GetMethodID(env, jclazz,"<init>", "()V"); //構造CwjThread類
if (mid == NULL)
{
return ;
}
obj = (*env)->NewObject(env, jclazz, mid, NULL); //創建該類的實例,生成的新對象為obj
cwjclazz = (*env)->FindClass(env, "LJava/lang/Thread;"); ////得到Thread類
if (cwjclazz == NULL)
{
return ;
}
mid2 = (*env)->GetMethodID(env, cwjclazz,"<init>", "(LJava/lang/Runnable;)V"); //獲取Runnable方法ID
if (mid2 == NULL)
{
return ;
}
obj2 = (*env)->NewObject(env, cwjclazz, mid2, obj); //構造Runnable對象
runmid = (*env)->GetMethodID(env, cwjclazz,"start", "()V"); //獲取Runable對象的start方法ID
if (runmid == NULL)
{
return ;
}
(*env)->CallVoidMethod(env, obj2, runmid); //執行start方法在JNI中,來啟動線程
(*env)->DeleteLocalRef(env, jclazz); //我們並沒有使用NewLocalRef有關本地引用的內容Android123在 android JNI開發終極篇中將詳細講述
}
上面的代碼可能我們發現JNI中構造一個類比Java層麻煩的多,需要先獲取ID,測試是否為空,然後編寫類方法的構造和類型簽名符號,多了很多這樣的操作,不過android開發網提醒大家畢竟JNI中沒有類的聲明引用,只有動態獲取這些方法的ID所以執行效率可能比Java還有所降低,類似Java反射一樣的處理機制,希望大家明白這個道理。
四、JNI中的異常處理實例代碼
class androidJniDemo5 {
private native void createException() throws IllegalArgumentException; //JNI中拋出一個參數不合法異常
private void throwException() throws NullPointerException {
throw new NullPointerException("Java error, android123 "); //Java中產生一個空指針異常
}
public static void main(String args[]) {
AndroidJniDemo5 ajd5 = new androidJniDemo5();
try {
ajd5.createException();
} catch (Exception e) {
e.printStackTrace();
}
}
static {
System.loadLibrary("androidJniDemo5");
}
}
下面的JNI中的異常具體代碼
JNIEXPORT void JNICALL
Java_androidJniDemo5_createException(JNIEnv *env, jobject obj)
{
jthrowable throwable;
jclass clazz = (*env)->GetObjectClass(env, obj);
jmethodID mid = (*env)->GetMethodID(env, clazz, "throwException", "()V"); //獲取Java中的throwException方法ID
if (mid == NULL)
{
return;
}
(*env)->CallVoidMethod(env, obj, mid); //執行throwException方法
throwable = (*env)->ExceptionOccurred(env); //有異常發生,其實android123提醒大家還可以使用JNI中的異常檢測ExceptionCheck函數來判斷
if (throwable) // 如果發生了異常
{
jclass newExceptionClazz;
(*env)->ExceptionDescribe(env);
(*env)->ExceptionClear(env);
newExceptionClazz = (*env)->FindClass(env,"Java/lang/IllegalArgumentException"); //實例化一個參數不合法異常
if (newExceptionClazz == NULL)
{
return;
}
(*env)->ThrowNew(env, newExceptionClazz, "JNI cwj exception"); //在JNI中拋出異常
}
}
最後我們可以看到在JNI中處理很多事情確實需要編寫很多代碼,同時有關類的構造符號什麼的,目前的IDE和編譯器無法檢查,所以android開發網提醒大家一定要記住Java簽名符號的格式和規范,下一次我們給出一些例子,幫助android NDK初學者快速了解JNI的規則。
盡管蘋果聯合創始人承認:android將取得最終勝利,不過很多人認為過於開放的環境依然不利於android,無差異的應用體驗正在制約Android超過iPhone。日前
創建好看的android布局是個不小的挑戰,當你花了數小時調整好它們適應多種設備後,你通常不想再重新調整,但笨重的嵌套布局效率往往非常低下,幸運的是,在android
android手機系統的一個重要特點就是它的應用框架和GUI庫都用Java語言實現,使用目前開發界使用最廣泛的開發語言,一定會使android手機系統在性能方面比其他的
android 平台已經得到中國手機產業鏈的廣泛關注和支持,下面就進行仔細而系統的對android開發技巧進行說明研究,希望本文能給大家帶來幫助。android原本就是