您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關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; @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 <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如何使用Jni實現壓力鍋數據檢測效果”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。