欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

安卓串口库android_serialport_api的简单移植方法,以及一些使用细节(有.so动态库的前提下)

程序员文章站 2022-06-21 20:07:45
网上试了很多方法(CMake、ndk-build),但由于android studio的版本问题,出现各种同步问题。后来发现前面的一大堆步骤的目的都是为了获取libserial_port.so这个文件,但是明显在github上下载的android_serialport_api已经有.so文件了,移植起来应该不会复杂,一直在想有没有无脑一点的操作方法,不用改build.gradle的那种。步骤如下,捡重点步骤和bug讲解,每一步详细步骤请参考其它博客:(1)在g......

网上试了很多方法(CMake、ndk-build),但由于android studio的版本问题,出现各种同步问题。

后来发现前面的一大堆步骤的目的都是为了获取libserial_port.so这个文件,但是明显在github上下载的android_serialport_api已经有.so文件了,移植起来应该不会复杂,一直在想有没有无脑一点的操作方法,不用改build.gradle的那种。

 

 

 

 

步骤如下,捡重点步骤和bug讲解,每一步详细步骤请参考其它博客:

 

 

(1)在github上下载的zip文件有两个文件夹,发现下面那个文件夹里面是有编译好的动态库的

安卓串口库android_serialport_api的简单移植方法,以及一些使用细节(有.so动态库的前提下)           安卓串口库android_serialport_api的简单移植方法,以及一些使用细节(有.so动态库的前提下)      安卓串口库android_serialport_api的简单移植方法,以及一些使用细节(有.so动态库的前提下)           安卓串口库android_serialport_api的简单移植方法,以及一些使用细节(有.so动态库的前提下)

 

 

 

(2)拷贝到android studio的工程中如下所示(拷贝过程不多说)

安卓串口库android_serialport_api的简单移植方法,以及一些使用细节(有.so动态库的前提下) 

 

注意这里的libserial_port.so最好直接新建一个jniLibs放进去(必须这个名字),不要放到libs目录下,不然就要修改build.gradle文件。最恶心的是,如果把.so文件放入了libs中且忘了修改build.gradle,在调用串口函数的时候就会出现闪退,而且这个程序编译时还不会报错(???)。

 

 

 

 

 

============锟斤拷==================锟斤拷=====================锟斤拷====================锟斤拷========锟斤拷========

 

 

 

 

 

(其他细节)

貌似是比较简单的移植方法了,但是还是需要补充一些小细节

 

1.SerialPort.java中的open、close标红问题和库加载问题

安卓串口库android_serialport_api的简单移植方法,以及一些使用细节(有.so动态库的前提下)

open和close标红没有影响,不用管它(因为我们直接so库用上了,没有新建jni文件夹这种操作所以才标红)。 System.loadLibrary加载的libname是.so文件去掉开头的lib三个字母后的名字(libserial_port.so => serial_port)

 

 

2.AndroidManifest.xml中的权限

安卓串口库android_serialport_api的简单移植方法,以及一些使用细节(有.so动态库的前提下)

抄来的,以防万一,如有需要请自行增删

 

 

3.串口调用

//一些变量

    public boolean UARTOpenFlag = false;
    private int size;

    private SerialPort UART4_SerialPort;  //串口4
    public OutputStream UART4_OutputStream;
    public InputStream UART4_InputStream;
    private byte[] UART4_buffer = new byte[64];

    private UART4_ReadThread UART4_Thread;

 

//打开串口4并开启读取线程

            UART4_SerialPort = new SerialPort(new File("/dev/ttyS4"), 115200, 0);
            UART4_OutputStream = UART4_SerialPort.getOutputStream();
            UART4_InputStream = UART4_SerialPort.getInputStream();

            UART4_Thread = new UART4_ReadThread();
            UART4_Thread.start();

 

//串口读取线程

private class UART4_ReadThread extends Thread {
        @Override
        public void run() {
            super.run();

            while (!isInterrupted()) {
                int data;
                try {
                    if (UART4_InputStream == null) {
                        mDebugHandler.sendEmptyMessage(MESSAGE_STOP);
                        return;
                    }

                    //从输入流中读取字节,并将其存储在缓冲区数组中,返回的是实际读取的字节数
                    size = UART4_InputStream.read(UART4_buffer);  // 只读了64位
                   
                } catch (IOException e) {
                    e.printStackTrace();
                    return;
                }
            }
            
        }
    }

 

 

 

 

 

 

 

 

 

 

 

 

 

本文地址:https://blog.csdn.net/qq_41862220/article/details/112890105