標籤:c調用java語言
本節學習使用C語言調用JAVA語言。在生活中比如我們某些底層的硬體必須使用C語言去編寫,當C語言返回的某些數值顯示在介面上時,就比如使用JNI。這樣可以將C返回的值顯示在介面上。
本節類比感應器返回的值,通過進度條顯示靈敏度,然後顯示到介面上。
1:介面布局就補多說了。裡面就2個Button,一個用於開啟監控,一個用於關閉監控,一個進度條
2:Activity代碼如下:
//開始監控buttonpublic void start(View v){startMonitor();}//停止監控buttonpublic 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 <jni.h>#include <stdio.h>#include <stdlib.h>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運行在子線程
//開始監控buttonpublic void start(View v){Thread thread = new Thread(){@Overridepublic void run() {startMonitor();}};thread.start();}
6:運行再次顯示效果:
可以正常顯示。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
Android學習JNI,使用C調用JAVA語言