栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 移动开发 > Android

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

Android 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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;

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里


JNIEXPORT void JNICALL Java_com_android_imooc_jni_MonitorActivity_startMonitor
 (JNIEnv *, jobject);

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:androidprojectApp_imoocbinclasses>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;
}

主页代码:


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程序设计有所帮助。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/156772.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号