溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Android如何使用Jni實(shí)現(xiàn)壓力鍋數(shù)據(jù)檢測效果

發(fā)布時(shí)間:2021-06-30 11:53:29 來源:億速云 閱讀:192 作者:小新 欄目:移動(dòng)開發(fā)

這篇文章給大家分享的是有關(guān)Android如何使用Jni實(shí)現(xiàn)壓力鍋數(shù)據(jù)檢測效果的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。

具體如下:

1、創(chuàng)建主頁:

package com.android.imooc.jni;
import com.android.imooc.R;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
/**
 * @描述     模仿壓力鍋檢測數(shù)據(jù)
 * @項(xiàng)目名稱   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的隨機(jī)數(shù)
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="開始監(jiān)測" />
  <Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="stop"
    android:text="結(jié)束監(jiān)測" />
  <com.android.imooc.jni.MyProgressBar
    android:id="@+id/pb"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
</LinearLayout>

4、進(jìn)度條代碼

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、轉(zhuǎn)到項(xiàng)目的src目錄,打開cmd窗口
輸入:

javah com.android.imooc.jni.MonitorActivity

生成文件com_android_imooc_jni_MonitorActivity
打開,把里面的兩個(gè)方法
拷貝到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、實(shí)現(xiàn)上面的兩個(gè)方法

1)首先在主頁面得到進(jìn)度條

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)實(shí)現(xiàn)在Monitor.c里的startMonitor方法

JNIEXPORT void JNICALL Java_com_android_imooc_jni_MonitorActivity_startMonitor
(JNIEnv * env , jobject obj){
while(1){
  //得到壓力數(shù)據(jù)
   int progress = getPressure();
   //使用反射的方法調(diào)用java里的showProgress方法
   //1、拿到字節(jié)嗎
   jclass clazz = ( *env)->FindClass(env, "com/android/imooc/jni/MonitorActivity");
   //2、獲得方法id,首先要獲得函數(shù)簽名,進(jìn)入到項(xiàng)目的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、回調(diào)
  ( *env)->CallVoidMethod(env, obj, id, progress);
}
}

3)、因?yàn)樯厦娴姆椒ㄊ褂昧藈hile(1)循環(huán),所以在java頁面的方法里必須使用子線程

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

4)如何實(shí)現(xiàn)停止呢?

定義變量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的隨機(jī)數(shù)
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();
       //使用反射調(diào)用java方法
       //拿到字節(jié)嗎
      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");
      //回調(diào)
      //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;
}

主頁代碼:

/**
 * @描述     模仿壓力鍋檢測數(shù)據(jù)
 * @項(xiàng)目名稱   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如何使用Jni實(shí)現(xiàn)壓力鍋數(shù)據(jù)檢測效果

感謝各位的閱讀!關(guān)于“Android如何使用Jni實(shí)現(xiàn)壓力鍋數(shù)據(jù)檢測效果”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI