Android通过JNI操作串口
1.本地类TtyNativeControl
package com.notioni.uart.manager;
import java.lang.ref.WeakReference;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
/**
* 本地方法类
*/
public classTtyNativeControl {
【Android通过JNI操作串口《一》】private final static String TAG = "TtyNativeControl";
static{
System.loadLibrary("uart_ctl");
}
private static final int TTY_MSG_RECEIVE= 1;
private static final int TTY_CLOSE_DEVICE= TTY_MSG_RECEIVE+1;
private EventHandler mEventHandler;
private ReceiveCallback mReceiveCallBack;
TtyNativeControl(){
mReceiveCallBack = null;
Looperlooper;
if((looper = Looper.myLooper())!= null){
mEventHandler = new EventHandler(this, looper);
}else if((looper = Looper.getMainLooper())!= null){
mEventHandler = new EventHandler(this, looper);
}else{
mEventHandler = null;
}
native_setup(newWeakReference
}
/**
* 打开驱动
* @return 是否打开成功
*/
public int openTty(){
return _openTty();
}
/**
* 关闭驱动,需要一定时间,所以采用Handler机制
*/
public int closeTty(){
//mEventHandler.obtainMessage(TTY_CLOSE_DEVICE).sendToTarget();
//return1;
return _closeTty();
}
/**
* 发送数据
* @param data
* @return
*/
publicint sendMsgToTty(byte[] data){
return _sendMsgToTty(data);
}
/**
* 接收数据
* @param callback
*/
public final voidreceiveMsgFromTty(ReceiveCallback callback){
mReceiveCallBack = callback;
_receiveMsgFromTty();
}
/**
* 设置串口数据位,校验位,速率,停止位
* @param databits数据位取值 位7或8
* @param event校验类型 取值N ,E, O,
* @param speed速率取值 2400,4800,9600,115200
* @param stopBit停止位取值1 或者 2
*/
publicint configTty(intdatabits,charevent,intspeed,intstopBit){
return _configTty(databits,event, speed, stopBit);
}
/**
* @param mode 是否使用原始模式(Raw Mode)方式来通讯取值0,1,2说明:0=nothing,1=Raw mode,2=no raw mode
* @param showLog 打印出串口信息Log取值1,0
*/
public int setMode(int mode ,int showLog){
return _setMode(mode,showLog);
}
/**
* 接收数据回调接口
*/
public interface ReceiveCallback{
void onReceiveData(byte[] data,TtyNativeControltty);
}
/****************************************************************
* 本地方法
*/
private native final void native_setup(Objecttty_this);
private native int _openTty();
private native int _closeTty();
private native int _sendMsgToTty(byte[] data);
private native void _receiveMsgFromTty();
private native int _configTty(int databits,char event,int speed,int stopBit);
private native int _setMode(int mode,int showLog);
/*
* 实现底层回调
*/
private static voidpostEventFromNative(Object tty_ref,int what ,intarg1,intarg2,Object obj){
Log.i(TAG, "[postEventFromNative] what:"+what);
TtyNativeControlt = (TtyNativeControl)((WeakReference)tty_ref).get();
if(t == null)return;
if(t.mEventHandler != null){
Messagem = t.mEventHandler.obtainMessage(what,arg1, arg2,obj);
t.mEventHandler.sendMessage(m);
}
}
private class EventHandler extends Handler{
private TtyNativeControl mTty;
publicEventHandler(TtyNativeControl t,Looper looper){
super(looper);
mTty = t;
}
@Override
public void handleMessage(Messagemsg) {
switch(msg.what){
case TTY_MSG_RECEIVE://底层接收数据回调上来的事件
if(mReceiveCallBack != null){
mReceiveCallBack.onReceiveData((byte[])msg.obj,mTty);
}
return;
case TTY_CLOSE_DEVICE://关闭驱动
_closeTty();
break;
}
}
}
}
2.JNI类头文件
#include
#ifndef _Included_com_notioni_uart_manager_TtyNativeControl
#define _Included_com_notioni_uart_manager_TtyNativeControl
#ifdef __cplusplus
extern "C"{
#endif
/**
* Class com_notioni_uart_TtyNativeControl
* Method
*/
JNIEXPORT static void JNICALL com_notioni_uart_manager_TtyNativeControl_native_setup(JNIEnv *env,jobject clazz,jobject weak_this);
JNIEXPORT static int JNICALL com_notioni_uart_manager_TtyNativeControl__openTty(JNIEnv *env,jobject clazz);
JNIEXPORT static int JNICALL com_notioni_uart_manager_TtyNativeControl__closeTty(JNIEnv *env,jobject clazz);
JNIEXPORT static int JNICALL com_notioni_uart_manager_TtyNativeControl__sendMsgToTty(JNIEnv *env,jobject clazz,jbyteArray data);
JNIEXPORT staticvoid JNICALL com_notioni_uart_manager_TtyNativeControl__receiveMsgFromTty(JNIEnv *env,jobject clazz);
JNIEXPORT static int JNICALL com_notioni_uart_manager_TtyNativeControl__configTty(JNIEnv *env,jobject clazz,int nBits,jchar nEvent,int nSpeed,int nStop);
JNIEXPORT static int JNICALL com_notioni_uart_manager_TtyNativeControl__setMode(JNIEnv *env,jobject clazz,int nMode,int showLog);
//JNIEXPORTint JNICALL com_notioni_uart_manager_TtyNativeControl__setSpeed(JNIEnv *env,jobject clazz,int speed);
//JNIEXPORTint JNICALL com_notioni_uart_manager_TtyNativeControl__setParity(JNIEnv *env,jobject clazz,int databits,int stopbits,int parity);
#ifdef __cplusplus
}
#endif
#endif