NDK开发综合案例——锅炉压力显示系统
Demo下载
https://github.com/linweimao/GuoLuApplication/tree/master
锅炉压力系统
-
创建一个项目,名字叫GuoLu
-
写 JNI.java(或者:在MainActivity里面写,得到锅炉压力值的native方法 getPressure())
-
在 Android.mk 文件中配置生成 .so文件的名称
Android.mk
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_LDLIBS := -llog LOCAL_MODULE := guolu LOCAL_SRC_FILES := GuoLu.c include $(BUILD_SHARED_LIBRARY)
Application.mk
APP_ABI := all APP_STL := stlport_static
-
-
分析实现的原理
-
在C代码中写锅炉压力值,返回给Java
int getPressure(){ int pressure = rand()%250; return pressure; }
在 C 代码中实现如下:
// // Created by 林伟茂 on 2020/4/12. // #include <stdio.h> #include <stdlib.h> #include <jni.h> /* * 得到锅炉的压力值 * 0~250之间 */ int getPressure(){ int pressure = rand()%250; return pressure; } /* * 从锅炉感应器中得到锅炉压力值 */ jint Java_com_lwm_guoluapplication_MainActivity_getPressure(JNIEnv *env, jobject instance) { int pressur = getPressure(); return pressur; }
-
在视图中动态绘制
1.锅炉显示压力结构体
2.测试模拟锅炉压力值C测试代码
#include<stdio.h>
#include<stdlib.h>
/**
模拟-得到锅炉的压力值范围:0~250
*/
int pressure = 50; //当前压力值,初始为50
//得到当前
int getPressure(){
int increase = rand()%20;
pressure += increase;
return pressure;
}
main(){
while(1){
sleep(500);
int pressure = getPressure();
if(pressure<=200) {
printf("压力值为%d, 在正常范围内 \n",pressure);
} else if(pressure<=250) {
printf("压力值为%d, 压力偏高 \n",pressure);
} else {
printf("压力值超过了最大值, 要爆炸啦! \n");
}
}
}
3. native方法
//native代码-得到锅炉的压力值
public native int getPressure();
4. C函数
#include <jni.h>
#include <stdlib.h>
int pressure = 50; //当前压力值,初始为50
//得到当前
int getPressure(){
int increase = rand()%20;
pressure += increase;
return pressure;
}
JNIEXPORT jint JNICALL Java_com_atguigu_guolu_MainActivity_getPressure
(JNIEnv * env, jobject jobj) {
return getPressure();
}
5. 自定义View
public class PressureView extends View {
private int max = 250;
private int pressure;
private Paint paint;
public int getMax() {
return max;
}
public void setMax(int max) {
this.max = max;
}
public int getPressure() {
return pressure;
}
public void setPressure(int pressure) {
this.pressure = pressure;
postInvalidate();
}
public PressureView(Context context, AttributeSet attrs) {
super(context, attrs);
paint = new Paint();
paint.setTextSize(20);
paint.setAntiAlias(true);
}
@Override
protected void onDraw(Canvas canvas) {
if(pressure>max) {
paint.setColor(Color.RED);
canvas.drawText("要爆炸了, 兄弟快跑!", 0, getHeight()/2, paint);
} else {
paint.setColor(Color.GRAY);
canvas.drawRect(20, 0, 60, getHeight(), paint);
int p = pressure*250/max;
if(p<200) {
paint.setColor(Color.GREEN);
} else {
paint.setColor(Color.RED);
}
canvas.drawRect(20, getHeight()-getHeight()*pressure/max, 60, getHeight(), paint);
}
}
}
6. 调用C更新界面
new Thread(new Runnable() {
@Override
public void run() {
while(true) {
SystemClock.sleep(500);
int pressure = getPressure();
pv_main.setPressure(pressure);
if(pressure>250) {
return;
}
}
}
}).start();