package android_serialport_api; import java.io.File; import java.io.FileDescriptor; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; /** * Google官方代码 * 此类的作用为,JNI的调用,用来加载.so文件的 * 获取串口输入输出流 */ public class SerialPort { private FileDescriptor mFd; private FileInputStream mFileInputStream; private FileOutputStream mFileOutputStream; static { System.loadLibrary("serial_port"); } public SerialPort(String devicePath, int baudRate, int flags) throws SecurityException { this(new File(devicePath), baudRate, flags); } private SerialPort(File device, int baudRate, int flags) throws SecurityException { if (!device.canRead() || !device.canWrite()) { try { Process su = Runtime.getRuntime().exec("/system/bin/su"); String cmd = "chmod 666 " + device.getAbsolutePath() + "\n" + "exit\n"; su.getOutputStream().write(cmd.getBytes()); if ((su.waitFor() != 0) || !device.canRead() || !device.canWrite()) { throw new RuntimeException("没有串口权限"); } } catch (Exception e) { throw new RuntimeException("提权失败" + e.getMessage(), e); } } mFd = open(device.getAbsolutePath(), baudRate, flags); mFileInputStream = new FileInputStream(mFd); mFileOutputStream = new FileOutputStream(mFd); } public InputStream getInputStream() { return mFileInputStream; } public OutputStream getOutputStream() { return mFileOutputStream; } private native static FileDescriptor open(String path, int baudrate, int flags); public native void close(); }