Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android學習JNI,使用C調用JAVA語言

Android學習JNI,使用C調用JAVA語言

編輯:關於Android編程

本節學習使用C語言調用JAVA語言。在生活中比如我們某些底層的硬件必須使用C語言去編寫,當C語言返回的某些數值顯示在界面上時,就比如使用JNI。這樣可以將C返回的值顯示在界面上。

本節模擬傳感器返回的值,通過進度條顯示靈敏度,然後顯示到界面上。

1:界面布局就補多說了。裡面就2個Button,一個用於開啟監控,一個用於關閉監控,一個進度條

2:Activity代碼如下:

 

//開始監控button
public void start(View v)
{
	startMonitor();
}

//停止監控button
public void stop(View v)
{
	stopMonitor();
}

//開始監控和停止監控的本地方法
public native void startMonitor();
public native void stopMonitor();

//c語言調用java的刷新進度條函數
public void showValue(int progress)
{
	bar.setProgress(progress);
}
3:本地JNI代碼

 

 

#include 
#include 
#include 
int monitor = 1;

//隨機產生的值
int getPressure()
{
	return rand()%100;
}

/*
 * Class:     com_demo_ccalljava_MainActivity
 * Method:    startMonitor
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_demo_ccalljava_MainActivity_startMonitor
  (JNIEnv *env, jobject obj)
{
	while(monitor)
	{
		//獲取當前的壓力值
		int value = getPressure();

		//利用反射找打show方法

		//1:找到字節碼文件
		jclass cClass = (*env)->FindClass(env, com/demo/ccalljava/MainActivity);
		//2:找到方法id
		//show是調用java方法的名字, (I)V是該方法的簽名
		jmethodID methodID = (*env)->GetMethodID(env,cClass, showValue, (I)V);
		//3:調用方法
		(*env)->CallVoidMethod(env, obj, methodID, value);

		sleep(1);
	}
}

/*
 * Class:     com_demo_ccalljava_MainActivity
 * Method:    stopMonitor
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_demo_ccalljava_MainActivity_stopMonitor
  (JNIEnv *env , jobject obj)
{
	monitor = 0;
}

3:加載動態庫

 

 

	static
	{
		System.loadLibrary(CCallJava);
	}
4:開始監控顯示:

 

\

當按下開始後,出現了卡死GUI,這是因為startMonitor是跑在主線程的,所以卡住GUI

5:修改,startMonitor運行在子線程

 

//開始監控button
public void start(View v)
{
	Thread thread = new Thread()
	{
		@Override
		public void run() {
			startMonitor();
		}
		
	};
	thread.start();
}

6:運行再次顯示效果:

 

\

可以正常顯示。

 

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