本节学习使用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 <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运行在子线程
//开始监控button public void start(View v) { Thread thread = new Thread() { @Override public void run() { startMonitor(); } }; thread.start(); }
6:运行再次显示效果:
可以正常显示。
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-09-29 01:29:06