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 {

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<TtyNativeControl>(this));

}

/**

* 打开驱动

* @return 是否打开成功

*/

public int openTty(){

return _openTty();

}

/**

* 关闭驱动,需要一定时间,所以采用Handler机制

*/

public int closeTty(){

// mEventHandler.obtainMessage(TTY_CLOSE_DEVICE).sendToTarget();

// return1;

return _closeTty();

}

/**

* 发送数据

* @param data

* @return

*/

public int sendMsgToTty(byte[] data){

return _sendMsgToTty(data);

}

/**

* 接收数据

* @param callback

*/

public final voidreceiveMsgFromTty(ReceiveCallback callback){

mReceiveCallBack = callback;

_receiveMsgFromTty();

}

/**

* 设置串口数据位,校验位,速率,停止位

* @param databits 数据位 取值 78

* @param event 校验类型 取值N ,E, O,

* @param speed 速率 取值 2400,4800,9600,115200

* @param stopBit 停止位 取值1 或者 2

*/

public int 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 <jni.h>

#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 static void 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);

//JNIEXPORT int JNICALL com_notioni_uart_manager_TtyNativeControl__setSpeed(JNIEnv *env,jobject clazz,int speed);

//JNIEXPORT int JNICALL com_notioni_uart_manager_TtyNativeControl__setParity(JNIEnv *env,jobject clazz,int databits,int stopbits,int parity);

#ifdef __cplusplus

}

#endif

#endif


更多相关文章

  1. Android(安卓)将asserts文件夹内文件写入SD卡中
  2. Android腾讯微薄客户端开发十三:提及篇(与我有关的微博)
  3. Android(安卓)SQLiteDatabase 的使用
  4. Android中JSON数据格式的简单使用
  5. Android(安卓)获取手机联系人信息
  6. android > SMS 短信数据库访问
  7. android之bundle传递数据--两个activities之间
  8. Android(安卓)实现一个http 带参数登录
  9. mybatisplus的坑 insert标签insert into select无参数问题的解决

随机推荐

  1. Android(安卓)Studio SVN/Git之忽略文件
  2. 6.1、Android(安卓)Studio配置构建
  3. Android(安卓)RecyclerView中ViewHolder
  4. Win7+VS2010+cocos2d-x 2.1 Beta3+Sqlite
  5. Android(安卓)Studio加载慢/导入包慢/gra
  6. 小米上市,小菜带你聊聊小米
  7. 跟随Android进入ARM v8a的世界 (1) - 从
  8. android滑动组件嵌套一般思路,多任务手势
  9. Android(安卓)用groovy在gradle自定义字
  10. android中四大引用的区别,强引用、软引用