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();