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

这篇具有很好参考价值的文章主要介绍了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);
            }
        }
    }
}

效果如图所示:

Android JNI实现锅炉压力显示系统详解,Android JNI基础笔记,android,jni,C语言,ndk,CMake文章来源地址https://www.toymoban.com/news/detail-646482.html

到了这里,关于Android JNI实现锅炉压力显示系统详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android显示系统SurfaceFlinger详解 超级干货

    本文详细讲解了Android显示系统SurfaceFlinger,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下 目录 一、Android系统启动 二、SurfaceFlinger代码剖析[Android 11] 1.【执行文件-surfaceflinger】 2.【动态库-libsurfaceflinger.so】 3. 服务启

    2024年03月14日
    浏览(42)
  • Android 12.0 系统settings系统属性控制一级菜单显示隐藏

    在12.0的系统rom定制化开发中,系统settings的一级菜单有些在客户需求中,要求通过系统属性来控制显示隐藏,从而达到控制一级菜单的显示的目的,而系统settings是通过静态加载的方式负责显示隐藏

    2024年02月06日
    浏览(74)
  • Android11.0 修改系统默认显示大小

    系统设置中的显示大小调整的就是屏幕密度,调整的越小,屏幕显示的内容就越多。 在系统中都会有定义一个默认的屏幕密度 设置中显示大小相关内容 源码:/packages/apps/Settings/res/xml/display_settings.xml 源码:/packages/apps/Settings/src/com/android/settings/display/ScreenZoomSettings.java 密度缩

    2024年02月09日
    浏览(33)
  • Android T 远程动画显示流程其二——系统侧动画启动流程

    接着上篇文章分析 Android T 远程动画显示流程其一 下面,我们以从桌面点击一个应用启动的场景来分析远程动画的流程,窗口添加的流程见Android T WMS窗口相关流程 这里我们从AppTransitionController.handleAppTransitionReady方法开始跟踪代码流程 代码路径:framework/services/core/java/com/and

    2024年03月28日
    浏览(32)
  • Android打开系统相机或从相册中选择图片并显示

    xml代码 展示  java代码 实机演示  

    2024年02月11日
    浏览(42)
  • Android 进阶——图形显示系统之VSync和 Choreographer的创建详解(一)

    前一篇文章Android 进阶——图形显示系统之底层图像显示原理小结(一)介绍了关于Android 图形显示系统的基础理论,相信你对于Android的图形显示系统中图形界面渲染刷新机制有了更深的了解,接下来进一步讲解VSync和Choreography的联系和作用。 VSync 可以提升Android 图形显示效果

    2024年02月10日
    浏览(32)
  • 解决Mac系统android monitor启动时卡住,显示白屏的问题

    清安装1.8版本的jdk,java1.8版本以上不支持android monitor;如果你电脑上安装有java 11等高级别的版本,请自行搜索,如果在mac上安装多jdk,以及如何切换到1.8版本上 请更新SWT插件,下载地址; 1.打开网页,点击4.9 跳转到另外的网页  2.跳转到的网页如下所示意   3. 点击下载此版

    2024年02月12日
    浏览(26)
  • Android 12.0 系统systemui状态栏下拉左滑显示通知栏右滑显示控制中心模块的流程分析

      在android12.0的系统rom定制化开发中,在系统原生systemui进行自定义下拉状态栏布局的定制的时候,需要在systemui下拉状态栏下滑的时候,根据下滑坐标来 判断当前是滑出通知栏还是滑出控制中心模块,所以就需要根据屏幕宽度,来区分x坐标值为多少是左滑出通知栏或者右滑

    2024年02月09日
    浏览(45)
  • Android 10.0 系统systemui状态栏下拉左滑显示通知栏右滑显示控制中心模块的流程分析

      在android10.0的系统rom定制化开发中,在系统原生systemui进行自定义下拉状态栏布局的定制的时候,需要在systemui下拉状态栏下滑的时候,根据下滑坐标来 判断当前是滑出通知栏还是滑出控制中心模块,所以就需要根据屏幕宽度,来区分x坐标值为多少是左滑出通知栏或者右滑

    2023年04月09日
    浏览(47)
  • Android 11.0 系统修改usb连接电脑mtp和PTP的显示名称

      在11.0的系统产品rom定制化开发中,在usb模块otg连接电脑,调整为mtp文件传输模式的时候,这时可以在电脑看到手机的内部存储 显示在电脑的盘符中,会有一个mtp名称做盘符,所以为了统一这个名称,就需要修改这个名称,接下来分析下处理的方法来解决这个问题 MTP的全称

    2024年01月17日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包