国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android使用Jni實現壓力鍋數據檢測效果示例

2019-12-12 01:22:08
字體:
來源:轉載
供稿:網友

本文實例講述了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 <stdio.h>#include <stdlib.h>#include <jni.h>#include <string.h>//獲得0到100的隨機數int getPressure(){  return rand() % 101;}

3、布局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  xmlns:tools="http://schemas.android.com/tools"  android:layout_width="match_parent"  android:layout_height="match_parent"  android:orientation="vertical"  tools:context=".MainActivity" >  <Button    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:onClick="start"    android:text="開始監測" />  <Button    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:onClick="stop"    android:text="結束監測" />  <com.android.imooc.jni.MyProgressBar    android:id="@+id/pb"    android:layout_width="wrap_content"    android:layout_height="wrap_content" /></LinearLayout>

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;@Overrideprotected 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 <stdio.h>#include <stdlib.h>#include <jni.h>#include <string.h>//獲得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程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 普陀区| 府谷县| 元朗区| 丁青县| 大关县| 富阳市| 肃宁县| 嘉义县| 濉溪县| 邛崃市| 喀喇| 沾益县| 塘沽区| 曲周县| 柳林县| 芦山县| 惠安县| 大港区| 莱阳市| 营口市| 日喀则市| 城口县| 宜黄县| 奎屯市| 孙吴县| 子洲县| 长阳| 教育| 壶关县| 磐石市| 柳林县| 灵川县| 博爱县| 南陵县| 达孜县| 星座| 宝山区| 栾城县| 崇信县| 大连市| 隆化县|