Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 中級開發 >> Android Jni中使用線程及回調更新UI

Android Jni中使用線程及回調更新UI

編輯:中級開發

  在Android使用Jni時,為了能夠使UI線程即主線程與工作線程分開,經常要創建工作線程,然後在工作線程中調用C/C++函數.為了在C/C++函數中更新android的UI,又時常使用回調。為了保證C/C++的工作函數以及回調函數都能輕易同時被Java的UI線程和創建的工作線程識別,我們聲明native時經常要把他們聲明成靜態函數.但靜態函數更新UI又會出現麻煩.為了解決這個問題,本人查閱了相關的一些文檔。有些文檔中涉及的問題並不是為了解決我要闡述的問題,但利用一下,就把這個問題解決了. 我寫了一個例子,來闡述整個過程的思路.

Java代碼:

package eagle.test;

public class EagleUI extends Activity

    TextView      mTextVIEw;

    MainHandler   mMainHandler;

    static MainHandler mHandler;

    //------------------------------------------------------ 

    static         System.loadLibrary("EagleZip");// 聲明所要調用的庫名稱     
    //------------------------------------------------------

    @Override
    public void onCreate(Bundle savedInstanceState)          super.onCreate(savedInstanceState);

         mTextView=(TextView)findViewById(R.id.MyTextVIEw);
         mMainHandler=new MainHandler();
         mHandler=mMainHandler;

         WorkThread tThread = new WorkThread ();
         new Thread(tThread).start();

    }

    //------------------------------------------------------
    public static void myCallbackFunc(String nMsg)           Message tMsg=new Message();
          Bundle tBundle=new Bundle();
          tBundle.putString("CMD", nMsg);
          tMsg.setData(tBundle);           mHandler.sendMessage(tMsg);     //------------------------------------------------------
    public static native String myJni(String nParam);// 對要調用的方法做本地聲明 

    //------------------------------------------------------

    public class zipThread implements Runnable           @Override
         public void run()               myJni("Eagle  is great"); 

         }
    }

    //------------------------------------------------------

    class MainHandler extends Handler          public MainHandler(){}

         public MainHandler(Looper L)              super(L);   
         public void handleMessage(Message nMsg)              super.handleMessage(nMsg);              Bundle tBundle=nMsg.getData();
             String tCmd=tBundle.getString("CMD");              EagleUI.this.mTextVIEw.setText(tCmd);      }

Java代碼:

#include <jni.h>

jclass  gJniClass;
jmethodID gJinMethod;

//---------------------------------------------------------------
JNIEXPORT JString JNICALL
Java_eagle_test_EagleUI_myJni(JNIEnv* env, jclass cls,JString param)      char   tChar[256];
     const char  *tpParam;      gJniClass = cls;
     gJinMethod = 0;

     gJinMethod=(*env)->GetStaticMethodID(env,gJniClass,"myCallbackFunc","(LJava/lang/String;)V");
     if(gJinMethod == 0 || gJinMethod == NULL)
         return (*env)->NewStringUTF(env, "-2");      strcpy(tChar,"Hello Eagle");

     (*env)->CallStaticVoidMethod(env,gJniClass,gJinMethod,(*env)->NewStringUTF(env, tChar));

     DisplayCallBack(env,tChar);

     tpParam =(*env)->GetStringUTFChars(env,param,0); 

     return param;
}

//---------------------------------------------------------------

void DisplayCallBack(JNIEnv* env,char nMsg[])      char tChars[256];      strcpy(tChars,nMsg);
     (*env)->CallStaticVoidMethod(env,gJniClass,gJinMethod,(*env)->NewStringUTF(env, tChars)); 
}

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