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

前些天发现了一个蛮有意思的人工智能学习网站,8个字形容一下"通俗易懂,风趣幽默",感觉非常有意思,忍不住分享一下给大家。
👉点击跳转到教程

第一步创建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);
            }
        }
    }
}

效果如图所示:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/72829.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Flume拦截器

实现 Interceptor接口 方法1 是初始化: 方法2和3重载 拦截: 方法3 是关闭: 但是flume是通过内部类创建对象的

类加载过程和类加载器

类加载的过程 加载->连接&#xff08;验证->准备->解析&#xff09;->初始化 加载 1.获得二进制字节流&#xff08;可以从本地jar 网络或者动态代理获得&#xff09; 2.转化成方法区中的运行时数据 3.获得类对应的Class对象 加载的过程由类加载器完成&…

【node】用node爬取网页文本内容,并创建文本 将内容存储到文本中,附带源码

用node爬取网页并没有大家想象的困难&#xff0c;下面我就向大家讲述如何爬取&#xff1a; 序幕&#xff1a; 首先大家要了解cheerio&#xff0c;这是我们在node中编辑爬取内容的关键 Cheerio 是一个基于核心 jQuery 库的快速、灵活的服务器端 HTML 解析工具。它可以让你使用…

htmlCSS-----案例展示

目录 前言 作品效果 html代码 CSS代码 图片资源 前言 在学习html过程中我们要试着去写写一些案例&#xff0c;通过这些案例让我们更加熟悉代码以及丰富我们的经验&#xff0c;下面是我个人写的一个案例&#xff0c;代码和图片也给出了大家&#xff0c;你们可以参考参考。…

获取 Android 的 SHA1 值

1、调试版&#xff0c;可以直接在 Android studio 中的 gradle 中查看。也可以用下面方法进行 前提要先确定签名文件所在的路径&#xff1a;调试版默认使用的签名文件是debug.keystore&#xff0c;文件处于 C 盘用户目录下的.android文件夹下。打开命令行工具&#xff0c; 1、…

2个电压源组成回路导致的物理学悖论

看这是一个由直流电压源和电容器直接串联组成的回路&#xff1a; 根据平时的分析可以知道 UaUc; UbUd; 根据电容相关定律可以知道&#xff1a; 电容电压不能够跳变&#xff0c;所以如果是从完全放电状态开始充电&#xff0c;开始2端电压一定是0,。 推理&#xff1a; 当接…

Spring 使用注解开发、代理模式、AOP

使用注解开发 在Spring4之后&#xff0c;要使用注解开发&#xff0c;必须要保证AOP的包导入了 项目搭建&#xff1a; 在配置文件中导入约束&#xff0c;增加注解支持 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.spri…

Web framework-Gin

一、Gin Go Web--Go Module 软件框架&#xff08;software framework&#xff09;&#xff0c;通常指的是为了实现某个业界标准或完成特定基本任务的软件组件规范&#xff0c;也指为了实现某个软件组件规范时&#xff0c;提供规范所要求之基础功能的软件产品。 框架就是&#…

【广州华锐视点】AR电力职业技能培训系统让技能学习更“智慧”

随着科技的发展&#xff0c;教育方式也在不断地进步和创新。其中&#xff0c;增强现实(AR)技术的出现&#xff0c;为教育领域带来了全新的可能。AR电力职业技能培训系统就是这种创新教学方法的完美实践&#xff0c;它将虚拟与现实相结合&#xff0c;为学生提供了一个沉浸式的学…

Django实现音乐网站 ⑼

使用Python Django框架制作一个音乐网站&#xff0c; 本篇主要是后台对专辑、首页轮播图原有功能的基础上进行部分功能实现和显示优化。 目录 专辑功能优化 新增编辑 专辑语种改为下拉选项 添加单曲优化显示 新增单曲多选 更新歌手专辑数、专辑单曲数 获取歌手专辑数 保…

FL Studio for Windows-21.1.0.3713中文直装版功能介绍及系统配置要求

FL Studio 21简称FL水果软件,全称是&#xff1a;Fruity Loops Studio编曲&#xff0c;由于其Logo长的比较像一款水果因此&#xff0c;在大家更多的是喜欢称他为水果萝卜&#xff0c;FL studio21是目前最新的版本&#xff0c;这是一款可以让你的计算机就像是一个全功能的录音室&…

kafka 02——三个重要的kafka客户端

kafka 02——三个重要的kafka客户端 1. 前言1.1 关于 Kafka 的安装1.2 常用客户端简介1.3 依赖 2. AdminClient2.1 Admin Configs2.2 AdminClient API2.2.1 设置 AdminClient 对象2.2.2 创建 topic 获取 topic 列表2.2.3 删除topic2.2.4 查看 topic 的描述信息2.2.5 查看 topi…

AMD限制资源用量CU_MASK

通过配置两个环境变量来控制进程所使用的CU&#xff1a; CU_MASK_0 CU_MASK_1 举例&#xff1a; 使用每个ES中的一半CU则配置如下&#xff1a; export CU_MASK_00xcccccccc export CU_MASK_10xcccccccc

Maven进阶2 -- 私服(Nexus)、私服仓库分类、资源上传和下载

目录 私服是一台独立的服务器&#xff0c;用于解决团队内部的资源共享与资源同步问题。 1.Nexus Nexus是sonatype公司的一款maven私服产品。 下载地址 启动 nexus.exe /run nexus 访问 & 登录 2.私服仓库分类 3.资源上传和下载 本地仓库上传和访问资源需要进行配置。…

【高频面试题】JVM篇

文章目录 一、JVM组成1.什么是程序计数器2.什么是Java堆&#xff1f;3.能不能介绍一下方法区(元空间&#xff09;4.你听过直接内存吗5.什么是虚拟机栈6.垃圾回收是否涉及栈内存&#xff1f;7.栈内存分配越大越好吗&#xff1f;8.方法内的局部变量是否线程安全&#xff1f;9.什么…

初识C语言(3)

什么是C语言 1.第一个C语言程序 2.数据类型 3.变量、常量 4.字符串转义字符注释 5.选择语句 6.循环语句 7.函数 8.数组 9.操作符 10.常见关键字 11.define 定义常量和宏 12.指针 13.结构体 这一篇文章我们从常见关键字开始说起&#xff0c;也是…

【设计模式】责任链模式

顾名思义&#xff0c;责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;为请求创建了一个接收者对象的链。这种模式给予请求的类型&#xff0c;对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。 在这种模式中&#xff0c;通常每个接收者…

韩国存储芯片顶不住了,加入价格大战,固态硬盘更白菜价了

国产的SSD固态硬盘价格持续下跌&#xff0c;迅速抢占市场&#xff0c;让美韩的存储芯片深感焦虑&#xff0c;之前美光曾跟进一轮&#xff0c;但是由于亏损严重&#xff0c;美光选择了退让&#xff0c;日前韩国第二大存储芯片企业SK海力士选择了跟进&#xff0c;将导致固态硬盘掀…

Linux 终端命令之文件浏览(4) head, tail

Linux 文件浏览命令 cat, more, less, head, tail&#xff0c;此五个文件浏览类的命令皆为外部命令。 hannHannYang:~$ which cat /usr/bin/cat hannHannYang:~$ which more /usr/bin/more hannHannYang:~$ which less /usr/bin/less hannHannYang:~$ which head /usr/bin/he…

痞子衡嵌入式:AppCodeHub - 一站网罗恩智浦MCU应用程序

近日&#xff0c;恩智浦官方隆重上线了应用程序代码中心(Application Code Hub&#xff0c;简称 ACH)&#xff0c;这是恩智浦 MCUXpresso 软件生态的一个重要组成部分。痞子衡之所以要如此激动地告诉大家这个好消息&#xff0c;是因为 ACH 并不是又一个恩智浦官方 github proje…