Android使用Jni實(shí)現(xiàn)壓力鍋數(shù)據(jù)檢測(cè)效果示例
本文實(shí)例講述了Android使用Jni實(shí)現(xiàn)壓力鍋數(shù)據(jù)檢測(cè)效果。分享給大家供大家參考,具體如下:
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; /** * @描述 模仿壓力鍋檢測(cè)數(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)測(cè)" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="stop" android:text="結(jié)束監(jiān)測(cè)" /> <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; }
主頁代碼:
/** * @描述 模仿壓力鍋檢測(cè)數(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相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android基本組件用法總結(jié)》、《Android開發(fā)入門與進(jìn)階教程》、《Android布局layout技巧總結(jié)》、《Android視圖View技巧總結(jié)》、《Android編程之a(chǎn)ctivity操作技巧總結(jié)》、《Android資源操作技巧匯總》及《Android控件用法總結(jié)》
希望本文所述對(duì)大家Android程序設(shè)計(jì)有所幫助。
- Android在JNI中使用ByteBuffer的方法
- 詳解AndroidStudio JNI +Gradle3.0以上JNI爬坑之旅
- 淺談Android Studio JNI生成so庫
- Android Studio開發(fā)之 JNI 篇的簡(jiǎn)單示例
- 記錄Android studio JNI開發(fā)的三種方式(推薦)
- 詳解Android JNI的基本使用(CMake)
- Android JNI c/c++調(diào)用java的實(shí)例
- Android JNI處理圖片實(shí)現(xiàn)黑白濾鏡的方法
- 使用Android studio編寫一個(gè)小的jni程序
- Android中的JNI數(shù)組操作教程
相關(guān)文章
Android Selector獲取焦點(diǎn)后文本背景修改的實(shí)現(xiàn)代碼
這篇文章主要介紹了Android Selector獲取焦點(diǎn)后文本背景修改的實(shí)現(xiàn)代碼,本文通過demo展示和實(shí)現(xiàn)代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-11-11Android Canvas和Bitmap結(jié)合繪圖詳解流程
在 Android Canvas 上繪圖非常難,在繪圖時(shí)需要理解許多不同的類和概念。這篇文章中,將介紹 Android 框架中可用的一些類,它們可以讓畫布使用時(shí)更輕松2021-11-11Android控件ViewPager實(shí)現(xiàn)帶有動(dòng)畫的引導(dǎo)頁
這篇文章主要為大家詳細(xì)介紹了Android控件ViewPager實(shí)現(xiàn)帶有動(dòng)畫的引導(dǎo)頁,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05Android識(shí)別預(yù)裝的第三方App方法實(shí)例
這篇文章主要給大家介紹了關(guān)于Android如何識(shí)別預(yù)裝的第三方App的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-01-01Android中模仿抖音加載框之兩顆小球轉(zhuǎn)動(dòng)效果
這篇文章主要介紹了Android仿抖音加載框之兩顆小球轉(zhuǎn)動(dòng)控件,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-09-09Android實(shí)現(xiàn)EditText控件禁止輸入內(nèi)容的方法(附測(cè)試demo)
這篇文章主要介紹了Android實(shí)現(xiàn)EditText控件禁止輸入內(nèi)容的方法,涉及Android針對(duì)EditText控件屬性設(shè)置的相關(guān)技巧,需要的朋友可以參考下2015-12-12Android開發(fā)之ViewFlipper自動(dòng)播放圖片功能實(shí)現(xiàn)方法示例
這篇文章主要介紹了Android開發(fā)之ViewFlipper自動(dòng)播放圖片功能實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了Android使用ViewFlipper實(shí)現(xiàn)圖片播放的相關(guān)界面布局及功能實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-03-03