您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關(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、效果如圖
感謝各位的閱讀!關(guān)于“Android如何使用Jni實(shí)現(xiàn)壓力鍋數(shù)據(jù)檢測效果”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!
免責(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)容。