【JNI】锅炉压力监测器

public class MainActivity extends Activity {

    private MyProgressBar pb;

    static{
        System.loadLibrary("hello");
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        pb = (MyProgressBar) findViewById(R.id.pb);
        pb.setMax(100);
    }

   public void start(View v){
       new Thread(){
           public void run() {
               startMonitor();
           };
       }.start();
   }
   public void stop(View v){
       stopMonitor();
   }

   public native void startMonitor();
   public native void stopMonitor();

   public void show(int pressure){
       pb.setPressure(pressure);
   }
}
public class MyProgressBar extends View {

    private int pressure;
    private int max;
    public MyProgressBar(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        // TODO Auto-generated constructor stub
    }

    public MyProgressBar(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
    }

    public MyProgressBar(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
    }

    public void setPressure(int pressure) {
        this.pressure = pressure;
        //使当前视图无效,如果当前视图是可见的,那么onDraw会调用,只能在主线程使用
//        invalidate();
        postInvalidate();
    }
    public void setMax(int max) {
        this.max = max;
    }
    @Override
    protected void onDraw(Canvas canvas) {

        Paint paint = new Paint();

        if(pressure < 50){
            paint.setColor(Color.GREEN);
        }
        else if(pressure < 80){
            paint.setColor(0xffff8800);
        }
        else {
            paint.setColor(Color.RED);

        }

        canvas.drawRect(10, 10 + max - pressure, 30, 10 + max, paint);
    }
}
#include <jni.h>
#include <stdio.h>
#include <stdlib.h>

int getPressure(){
    //……监测电压……运算得到压力值
    return rand() % 101;
}

int monitor;
JNIEXPORT void JNICALL Java_com_itheima_monitor_MainActivity_startMonitor
  (JNIEnv * env, jobject obj){
    monitor = 1;
    while(monitor){
        //获取锅炉压力
        int pressure = getPressure();

        //jclass      (*FindClass)(JNIEnv*, const char*);
        jclass clazz = (*env)->FindClass(env, "com/itheima/monitor/MainActivity");
        //jmethodID   (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);
        jmethodID methodId = (*env)->GetMethodID(env, clazz, "show", "(I)V");
        //void        (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...);
        (*env)->CallVoidMethod(env, obj, methodId, pressure);
        sleep(1);
    }

}

JNIEXPORT void JNICALL Java_com_itheima_monitor_MainActivity_stopMonitor
 (JNIEnv * env, jobject obj){
    monitor = 0;
}

Application.mk

APP_ABI := armeabi x86

Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := hello
LOCAL_SRC_FILES := hello.c

include $(BUILD_SHARED_LIBRARY)
时间: 2024-12-28 11:08:21

【JNI】锅炉压力监测器的相关文章

JNI与底层调用2

1. 掌握如何使用广播接收者拦截电话和短信 在日常生活中,当手机丢失后,我们可以启动一系列的措施来获取丢失手机的位置信息,或者清楚丢失手机的数据来防止隐私数据泄露,本章就针对这些防盗保护措施进行讲解. 2. JNI 开发中常见错误 2.1 动态库名称写错,或者不存在 static{ System.loadLibrary("hell0"); } 当我们在写上面代码的时候如果不小心将hello 写成了hell0.或者libhello.so 动态库不存在,那么系 统启动时会报如下异常. 2.

JNI_3

①交叉编译概念 在windows上编译可以在除了windows平台之外 可以执行的机器码 android是Linux windows编译在linux上执行的机器码 动态链接库 .so   .dll NDK google提供的交叉编译的工具 ②如何使用ndk指令 ndk-build  添加到环境变量  可以在工程的根目录下执行ndk-build开启一个交叉编译的过程 ndk解压的路径不要包含空格 ndk-build->在当前目录下找jni的目录->找Android.mk(必须的) 解析这个配置文

android113 自定义进度条

MainActivity: package com.itheima.monitor; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.view.View; import android.widget.ProgressBar; public class MainActivity extends Activity { private MyProgressBa

程序员的福利:Android_JNI整套视频分享

1.Android_JNI_回顾昨天内容&概括今天内容http://www.itlanbao.com/vd/video.aspx?v=200078 2.Android_JNI_在C语言中实现字符串运算http://www.itlanbao.com/vd/video.aspx?v=200077 3.Android_JNI_在C代码实现数组运http://www.itlanbao.com/vd/video.aspx?v=200076 4.Android_JNI_使用C语言校验密码综合案例http:/

C# 历史曲线控件 基于时间的曲线控件 可交互的高级曲线控件 HslControls曲线控件使用教程

本篇博客主要对 HslControls 中的曲线控件做一个详细的教程说明,大家可以根据下面的教程开发出高质量的曲线控件 Prepare 先从nuget下载到组件,然后就可以使用组件里的各种组件信息了. 在Visual Studio 中的NuGet管理器中可以下载安装,也可以直接在NuGet控制台输入下面的指令安装: Install-Package HslControls NuGet安装教程  http://www.cnblogs.com/dathlin/p/7705014.html 技术支持QQ

JNI(Java Native Interface)_03

JNI(Java Native Interface)_03 c/c++区别 jni调用: * c: jstring str = (*env)->NewStringUTF(env,getHello()); * c++:jstring str = (env)->NewStringUTF(getHello()); * 区别如下: * 1,c++中把(*env) 的\*号去掉 * 2,调用函数的时候吧参数env去掉 * 3,c中是结构体 c++是类 * 4,c结构体中的函数指针 c++类的成员函数(c

一天掌握Android JNI本地编程 快速入门

一.JNI(Java Native Interface)  1.什么是JNI:               JNI(Java Native Interface):java本地开发接口 JNI是一个协议,这个协议用来沟通java代码和外部的本地代码(c/c++) 外部的c/c++代码也可以调用java代码  2.为什么使用JNI: 效率上 C/C++是本地语言,比java更高效 代码移植,如果之前用C语言开发过模块,可以复用已经存在的c代码 java反编译比C语言容易,一般加密算法都是用C语言编写

智慧锅炉物联网云平台方案

多比锅炉物联网云平台解决方案结合了最先进的物联网.云计算.传感器等技术, 在大屏幕和手机端同时实时显示所有已联网设备的实时运行情况,当锅炉出现报警或预警时,快速准确的推送消息到手机客户端APP或微信.利用多比智能网关,厂家可以远程调试锅炉中PLC(如西门子200)的程序和代码,大大节省出差费用,提高服务的响应速度.通过大数据分析,对锅炉的横向数据(不同锅炉之间的数据)与纵向数据(单一锅炉的历史数据)进行统计,为设备运维,售后服务,设备升级,故障告警,故障排查等方面提供有力支持. 锅炉物联网云平台

Android jni/ndk编程四:jni引用类型

一.JNI引用类型 JNI支持三种类型的 opaque reference:local references, global references,和weak global references,下面我们将逐一探讨. local references 大部分JNI 函数都会创建LocalRef,如NewObject创建一个实例,并返回一个指向该实例的LocalRef.LocalRef只在本线程的 native method中有效. 一但native method返回,LocalRef 将被释放.