Android使用Jni实现压力锅数据检测效果示例
本文实例讲述了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相关内容感兴趣的读者可查看本站专题:《Android基本组件用法总结》、《Android开发入门与进阶教程》、《Android布局layout技巧总结》、《Android视图View技巧总结》、《Android编程之activity操作技巧总结》、《Android资源操作技巧汇总》及《Android控件用法总结》
希望本文所述对大家Android程序设计有所帮助。
赞 (0)