热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Android使用Jni实现压力锅数据检测效果示例

这篇文章主要介绍了Android使用Jni实现压力锅数据检测效果,涉及Android结合Jni实现进度条模拟压力锅数据监测效果的相关操作技巧,需要的朋友可以参考下

本文实例讲述了Android使用Jni实现压力锅数据检测效果。分享给大家供大家参考,具体如下:

1、创建主页:

package com.android.imooc.jni;
import com.android.imooc.R;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
/**
 * @描述     模仿压力锅检测数据
 * @项目名称   App_imooc
 * @包名     com.android.imooc.jni
 * @类名     MonitorActivity
 * @author   chenlin
 * @date    2012年6月9日 下午3:18:11
 * @version   1.0
 */
public class MonitorActivity extends Activity {
  static{
    System.loadLibrary("monitor");
  }
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_monitor);
  }
  public void start(View view){
    startMonitor();
  }
  public void stop(View view){
    stopMonitor();
  }
  public native void startMonitor();
  public native void stopMonitor();
}

2、在jni文件夹里写Monitor.c

#include 
#include 
#include 
#include 
//获得0到100的随机数
int getPressure(){
  return rand() % 101;
}

3、布局文件:


  

4、进度条代码

package com.android.imooc.jni;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;
public class MyProgressBar extends View {
  //压力
  private int mPresure;
  //最大值
  private int mMax;
  public MyProgressBar(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
  }
  public MyProgressBar(Context context, AttributeSet attrs) {
    super(context, attrs);
  }
  public MyProgressBar(Context context) {
    super(context);
  }
  public void setPressure(int pressure) {
    this.mPresure = pressure;
    // invalidate();
    postInvalidate();
  }
  public void setMax(int max) {
    this.mMax = max;
  }
  @Override
  protected void onDraw(Canvas canvas) {
    Paint paint = new Paint();
    if (mPresure <50) {
      paint.setColor(Color.GREEN);
    } else if (mPresure <80) {
      paint.setColor(0xffff8800);
    } else {
      paint.setColor(Color.RED);
    }
    canvas.drawRect(10, 10 + mMax - mPresure, 30, 10 + mMax, paint);
  }
}

5、转到项目的src目录,打开cmd窗口
输入:

javah com.android.imooc.jni.MonitorActivity

生成文件com_android_imooc_jni_MonitorActivity
打开,把里面的两个方法
拷贝到Monitor.c里

/*
 * Class:   com_android_imooc_jni_MonitorActivity
 * Method:  startMonitor
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_android_imooc_jni_MonitorActivity_startMonitor
 (JNIEnv *, jobject);
/*
 * Class:   com_android_imooc_jni_MonitorActivity
 * Method:  stopMonitor
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_android_imooc_jni_MonitorActivity_stopMonitor
 (JNIEnv *, jobject);

6、实现上面的两个方法

1)首先在主页面得到进度条

private MyProgressBar mProgressBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_monitor);
  mProgressBar = (MyProgressBar) findViewById(R.id.pb);
  mProgressBar.setMax(100);
}
public void showProgress(int progress){
  mProgressBar.setPressure(progress);
}

2)实现在Monitor.c里的startMonitor方法

JNIEXPORT void JNICALL Java_com_android_imooc_jni_MonitorActivity_startMonitor
(JNIEnv * env , jobject obj){
while(1){
  //得到压力数据
   int progress = getPressure();
   //使用反射的方法调用java里的showProgress方法
   //1、拿到字节吗
   jclass clazz = ( *env)->FindClass(env, "com/android/imooc/jni/MonitorActivity");
   //2、获得方法id,首先要获得函数签名,进入到项目的bin/classes目录-->打开cmd窗口-->输入命令
  // E:\androidproject\App_imooc\bin\classes>javap -s com/android/imooc/jni/MonitorActivity
  //获得签名“(I)V”
    jmethodID id = ( *env)->GetMethodID(env, clazz, "showProgress", "(I)V");
   //3、回调
  ( *env)->CallVoidMethod(env, obj, id, progress);
}
}

3)、因为上面的方法使用了while(1)循环,所以在java页面的方法里必须使用子线程

public void start(View view){
    new Thread(new Runnable() {
      @Override
      public void run() {
        startMonitor();
      }
    }).start();
}

4)如何实现停止呢?

定义变量int monitor;
在方法Java_com_android_imooc_jni_MonitorActivity_startMonitor里初始化为mOnitor= 1

while(monitor){
…………………
}

在方法Java_com_android_imooc_jni_MonitorActivity_stopMonitor里初始化为mOnitor= 0

7、最后代码Monitor.c

#include 
#include 
#include 
#include 
//获得0到100的随机数
int getPressure(){
  return rand() % 101;
}
int monitor;
JNIEXPORT void JNICALL Java_com_android_imooc_jni_MonitorActivity_startMonitor
(JNIEnv * env , jobject obj){
  mOnitor= 1;
  while(monitor){
    int progress = getPressure();
       //使用反射调用java方法
       //拿到字节吗
      jclass clazz = ( *env)->FindClass(env, "com/android/imooc/jni/MonitorActivity");
      //获得方法id
      //jmethodID  (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);
      jmethodID id = ( *env)->GetMethodID(env, clazz, "showProgress", "(I)V");
      //回调
      //void    (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...);
      ( *env)->CallVoidMethod(env, obj, id, progress);
      sleep(0.3f);
  }
}
JNIEXPORT void JNICALL Java_com_android_imooc_jni_MonitorActivity_stopMonitor
(JNIEnv * env , jobject obj){
  mOnitor= 0;
}

主页代码:

/**
 * @描述     模仿压力锅检测数据
 * @项目名称   App_imooc
 * @包名     com.android.imooc.jni
 * @类名     MonitorActivity
 * @author   chenlin
 * @date    2012年6月9日 下午3:18:11
 * @version   1.0
 */
public class MonitorActivity extends Activity {
  private MyProgressBar mProgressBar;
  static{
    System.loadLibrary("monitor");
  }
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_monitor);
    mProgressBar = (MyProgressBar) findViewById(R.id.pb);
    mProgressBar.setMax(100);
  }
  public void start(View view){
    new Thread(new Runnable() {
      @Override
      public void run() {
        startMonitor();
      }
    }).start();
  }
  public void stop(View view){
    stopMonitor();
  }
  public native void startMonitor();
  public native void stopMonitor();
  public void showProgress(int progress){
    mProgressBar.setPressure(progress);
  }
}

8、效果如图

更多关于Android相关内容感兴趣的读者可查看本站专题:《Android基本组件用法总结》、《Android开发入门与进阶教程》、《Android布局layout技巧总结》、《Android视图View技巧总结》、《Android编程之activity操作技巧总结》、《Android资源操作技巧汇总》及《Android控件用法总结》

希望本文所述对大家Android程序设计有所帮助。


推荐阅读
  • Android 九宫格布局详解及实现:人人网应用示例
    本文深入探讨了人人网Android应用中独特的九宫格布局设计,解析其背后的GridView实现原理,并提供详细的代码示例。这种布局方式不仅美观大方,而且在现代Android应用中较为少见,值得开发者借鉴。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • Android LED 数字字体的应用与实现
    本文介绍了一种适用于 Android 应用的 LED 数字字体(digital font),并详细描述了其在 UI 设计中的应用场景及其实现方法。这种字体常用于视频、广告倒计时等场景,能够增强视觉效果。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 解决JAX-WS动态客户端工厂弃用问题并迁移到XFire
    在处理Java项目中的JAR包冲突时,我们遇到了JaxWsDynamicClientFactory被弃用的问题,并成功将其迁移到org.codehaus.xfire.client。本文详细介绍了这一过程及解决方案。 ... [详细]
  • QUIC协议:快速UDP互联网连接
    QUIC(Quick UDP Internet Connections)是谷歌开发的一种旨在提高网络性能和安全性的传输层协议。它基于UDP,并结合了TLS级别的安全性,提供了更高效、更可靠的互联网通信方式。 ... [详细]
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
  • 将Web服务部署到Tomcat
    本文介绍了如何在JDeveloper 12c中创建一个Java项目,并将其打包为Web服务,然后部署到Tomcat服务器。内容涵盖从项目创建、编写Web服务代码、配置相关XML文件到最终的本地部署和验证。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • 本文介绍如何在 Unity 的 XML 配置文件中,将参数传递给自定义生命周期管理器的构造函数。我们将详细探讨 CustomLifetimeManager 类的实现及其配置方法。 ... [详细]
  • 本文详细介绍了 Java 中 org.apache.xmlbeans.SchemaType 类的 getBaseEnumType() 方法,提供了多个代码示例,并解释了其在不同场景下的使用方法。 ... [详细]
  • 本文详细介绍了如何解决MyBatis中常见的BindingException错误,提供了多种排查和修复方法,确保Mapper接口与XML文件的正确配置。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 本文探讨了在通过 API 端点调用时,使用猫鼬(Mongoose)的 findOne 方法总是返回 null 的问题,并提供了详细的解决方案和建议。 ... [详细]
  • 探讨如何真正掌握Java EE,包括所需技能、工具和实践经验。资深软件教学总监李刚分享了对毕业生简历中常见问题的看法,并提供了详尽的标准。 ... [详细]
author-avatar
喵喵浮游生物
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有