NDK開發綜合案例——鍋爐壓力顯示系統

Demo下載

https://github.com/linweimao/GuoLuApplication/tree/master

鍋爐壓力系統

  1. 創建一個項目,名字叫GuoLu

    1. 寫 JNI.java(或者:在MainActivity裏面寫,得到鍋爐壓力值的native方法 getPressure()

    2. 在 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
      
  2. 分析實現的原理

  3. 在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;
    }
    
  4. 在視圖中動態繪製

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();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章