Android JNI实现锅炉压力显示系统详解

简介: Android JNI实现锅炉压力显示系统详解

第一步创建GuoLu.c文件

//
// Created by DELL on 2023/8/13.
//
#include <stdio.h>
#include <stdlib.h>
#include <jni.h>
#include <unistd.h>
int pressure = 20;
int getPressure() {
    int increase = rand() % 25;
    pressure += increase;
    return pressure;
}
/**
 * 从锅炉感应器中得到锅炉压力值
 */
jint Java_com_example_guolu_MainActivity_getPressure(JNIEnv *env, jobject thiz) {
    int pressure = getPressure();
    return pressure;
}

第二步在build.gradle文件中,进行相关配置

plugins {
    id 'com.android.application'
}
android {
    compileSdkVersion 33
    buildToolsVersion "30.0.3"
    defaultConfig {
        applicationId "com.example.guolu"
        minSdkVersion 23
        targetSdkVersion 33
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        // 增加cmake控制属性
        externalNativeBuild {
            cmake {
                // 指定编译架构
                abiFilters 'arm64-v8a', 'armeabi-v7a', 'x86', 'x86_64'
            }
        }
    }
    // 在android节点下
    // 指定CMakeLists.txt路径
    externalNativeBuild {
        cmake {
            // 在该文件种设置所要编写的c源码位置,以及编译后so文件的名字
            path 'CMakeLists.txt'
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}
dependencies {
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'com.google.android.material:material:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    testImplementation 'junit:junit:4.+'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}

第三步实现在MainActivity中,调用相关的C代码,显示锅炉压力值,根据压力值显示不同的UI在Android设备上

public class MainActivity extends AppCompatActivity {
    {
        System.loadLibrary("GuoLu");
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        PressureView pressureView = new PressureView(this);
        setContentView(pressureView);
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    SystemClock.sleep(1000);
                    int pressure = Math.round(getPressure());//0-250
                    pressureView.setPressure(pressure);
                    if (pressure > 220) {//如果压力大于220就要爆炸
                        break;
                    }
                }
            }
        }).start();
    }
    /**
     * native代码
     * 调用C代码中对应的方法
     *
     * @return
     */
    public native int getPressure();
}

第四步实现自定义View,PressureView

/**
 * @Author: ly
 * @Date: 2023/8/13
 * @Description: 锅炉压力值显示自定义view
 */
public class PressureView extends View {
    /**
     * 锅炉压力值
     */
    private int pressure;
    /**
     * 画笔
     */
    private Paint paint;
    public PressureView(Context context) {
        this(context, null);
    }
    public PressureView(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }
    public PressureView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }
    private void init() {
        paint = new Paint();
        paint.setAntiAlias(true);//设置抗锯齿
        paint.setTextSize(20);
    }
    public void setPressure(int pressure) {
        this.pressure = pressure;
//        invalidate(); 在主线程调用
        postInvalidate();//在子线程使用这个进行绘制 onDraw() 执行
    }
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (pressure > 220) {
            //1.如果压力值大于200,就绘制文本,显示锅炉爆炸了,快跑
            canvas.drawText("快跑!", 10, getHeight() / 2, paint);
        } else {
            //2.正常和提示的情况
            paint.setColor(Color.GRAY);
            canvas.drawRect(10, 10, 60, 260, paint);
            //设置背景颜色为灰色
            //2.1.如果小于200正常显示,并且设置画笔颜色,绿色
            if (pressure < 200) {
                paint.setColor(Color.GREEN);
                canvas.drawRect(10, 260 - pressure, 60, 260, paint);
            }
            //2.2.如果大于200警示显示,并且设置画笔颜色,红色
            if (pressure > 200) {
                paint.setColor(Color.RED);
                canvas.drawRect(10, 260 - pressure, 60, 260, paint);
            }
        }
    }
}

效果如图所示:


目录
相关文章
|
2月前
|
Android开发
Android 如何将定制的Launcher成为系统中唯一的Launcher
Android 如何将定制的Launcher成为系统中唯一的Launcher
55 2
|
20天前
|
存储 监控 调度
Android系统服务:WMS、AMS相关知识
参考文献 Android窗口管理服务WindowManagerService计算Activity窗口大小的过程分析 Android窗口管理服务WindowManagerService显示Activity组件的启动窗口(Starting Window)的过程分析 Android窗口管理服务WindowManagerService对输入法窗口(Input Method Window)的管理分析 Android窗口管理服务WindowManagerService显示窗口动画的原理分析
|
24天前
|
Java Linux Android开发
Android面试题之说说系统的启动流程(总结)
这篇文章概述了Android系统的启动流程,从Boot Rom到Zygote进程和SystemServer的启动。init进程作为用户级别的第一个进程,负责创建文件目录、初始化服务并启动Zygote。Zygote通过预加载资源和创建Socket服务,使用fork函数生成SystemServer进程。fork过程中,子进程继承父进程大部分信息但具有独立的进程ID。Zygote预加载资源以减少后续进程的启动时间,而SystemServer启动众多服务并最终开启Launcher应用。文中还讨论了为何从Zygote而非init或SystemServer fork新进程的原因。
29 2
|
1月前
|
JavaScript Java 测试技术
基于ssm+vue.js+uniapp小程序的安卓的微博客系统附带文章和源代码部署视频讲解等
基于ssm+vue.js+uniapp小程序的安卓的微博客系统附带文章和源代码部署视频讲解等
28 2
|
13天前
|
安全 搜索推荐 Android开发
探索安卓和iOS系统的优劣与特点
在移动操作系统领域,安卓和iOS一直是最热门的两个选择。本文将探讨安卓和iOS系统的优劣与特点,帮助读者更好地了解这两个操作系统,并为选择合适的移动设备提供参考。
19 0
|
2月前
|
Android开发
【通讯录教程】苹果安卓鸿蒙系统通用,如何大批量导入手机号码到手机的通讯录,下面教你方法,只需1分钟搞定几万个号码的导入手机电话本
该文介绍了一种快速批量导入手机通讯录的方法,适用于处理大量手机号的需求,如微商管理、客户资料整理等。在QQ同步助手开始收费后,提供了免费的替代方案。步骤包括:下载批量导入软件(链接提供腾讯云盘和百度网盘地址),清空通讯录(非必需),制作符合格式的通讯录文件,并按操作系统(苹果、安卓或鸿蒙)进行导入。整个过程只需1分钟,简便快捷。
|
2月前
|
安全 搜索推荐 物联网
构建未来:基于Android的智能物联网家居系统
【5月更文挑战第15天】 在快速发展的数字化时代,智能物联网(IoT)技术与移动操作系统的结合正在塑造未来家居的生活方式。特别是Android平台,以其开放性、灵活性和广泛的用户基础,成为智能家居创新的理想选择。本文将探讨如何利用Android系统构建一个高效、安全且易于扩展的智能家居控制系统,涵盖系统设计、关键技术实现以及可能面临的挑战。通过分析具体案例,我们旨在为开发者和企业提供一套可行的解决方案蓝图,以促进智能家居领域的进一步发展。
|
24天前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的安卓的微博客系统的详细设计和实现
基于SpringBoot+Vue+uniapp的安卓的微博客系统的详细设计和实现
14 0
|
2月前
|
存储 缓存 Android开发
Android系统分区与升级
Android系统分区与升级
59 4
|
2月前
|
Android开发
Android获取当前系统日期和时间的三种方法
Android获取当前系统日期和时间的三种方法
50 4