这个例子主要是演示了JNI在实际开发中的开发流程。在实际开发中,android工程师只需要从C/C++工程师那里
拿到底层的一些逻辑代码,整合到jni目录下的.c文件即可
一、原理图
二、效果图
三、代码实现
1、MyView
package com.njupt.monitor;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.view.View;
public class MyView extends View {
private int bottom;
private Paint paint;
public MyView(Context context,int bottom,int color) {
super(context);
this.bottom = bottom;
paint = new Paint();
paint.setColor(color);
paint.setStrokeWidth(10);
}
/**
* android下所有的view控件的显示其实都是通过onDraw()
* canvas 代表的是屏幕的画布...
*/
@Override
protected void onDraw(Canvas canvas) {
//bottom值 需要根据锅炉的压力 动态确定
canvas.drawRect(20, 20,30,bottom,paint);
super.onDraw(canvas);
}
}
2、MainActivity
package com.njupt.monitor;
import java.util.Timer;
import java.util.TimerTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.graphics.Color;
import android.view.Menu;
import android.widget.TextView;
public class MainActivity extends Activity {
public native int getPressure();
private Timer timer;
private TimerTask task;
private Handler handler = new Handler(){//消息机制的模板代码。。。在主线程中更新界面
public void handleMessage(android.os.Message msg) {
int pressure = (Integer) msg.obj;
int color = getColor(pressure);
if(color == 404){
TextView tv = new TextView(MainActivity.this);
tv.setTextColor(Color.RED);
tv.setTextSize(30);
tv.setText("锅炉快爆炸了...快跑吧~~~~~");
setContentView(tv);
timer.cancel();
return ;
}
MyView myView = new MyView(MainActivity.this, pressure, color);
setContentView(myView);//****这里需要注意,这时不再是通过.xml文件来画界面
super.handleMessage(msg);
};
};
static{
System.loadLibrary("Hello");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//获取锅炉压力 ,根据压力显示不同的内容
timer = new Timer();
task = new TimerTask() {
@Override
public void run() {
int pressure = getPressure()%300;
System.out.println("压力: " + pressure);
//把压力显示到UI界面上
Message msg = new Message();
msg.obj = pressure;
handler.sendMessage(msg);
}
};
timer.schedule(task, 1000,2000);
}
/**
* 根据锅炉压力,获取应该显示的颜色
* @param pressure
* @return
*/
public int getColor(int pressure){
if(pressure < 100){
return Color.GREEN;
}else if(pressure < 200){
return Color.YELLOW;
}else if(pressure < 260){
return Color.RED;
}else{
return 404;
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
3、Hello.c
#include <stdio.h>
#include <jni.h>
#include <stdlib.h>
#include "com_njupt_monitor_MainActivity.h"
#include <android/log.h>//include D:\android-ndk-r7b\platforms\android-8\arch-arm\usr\include\android下的log.h这个目录
#define LOG_TAG "System.out"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
/**
* getpressure()的代码由C/C++工程师提供
*/
int getpressure(){
// c语言中的随机数
return rand();
}
JNIEXPORT jint JNICALL Java_com_njupt_monitor_MainActivity_getPressure
(JNIEnv * env, jobject obj){
return getpressure();
}
4、Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := Hello
LOCAL_SRC_FILES := Hello.c
LOCAL_LDLIBS += -llog
include $(BUILD_SHARED_LIBRARY)
5、在此过程中需要用到的命令请参考上一篇博客。。。。