一、创建 NDK 项目

这里在 AndroidStudio 中使用的是 CMark 工具,下载方法如下图所示:

android studio写API接口程序 android studio接口调用_通讯

然后创建一个新项目,勾选 C++,如下图所示:

android studio写API接口程序 android studio接口调用_android ndk_02

别忘记也要勾选:

android studio写API接口程序 android studio接口调用_串口_03

确认以上都勾选后,开始创建项目。

注意:如果是中途项目需要导入 NDK 可按照如下步骤拷贝:

1、在 app 的 gradle 文件内拷贝如下脚本:

android{
    defaultConfig{
        externalNativeBuild {
            cmake {
                cppFlags "-frtti -fexceptions"
            }
        }
    }
    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }
}

2、在项目的 local.properties 文件下加入如下脚本:

# 指定 NDK 文件夹
ndk.dir=E\:\\App\\Android-sdk\\ndk-bundle

3、拷贝 CMakeLists.txt 文件到新项目中

二、导入文件

1、拷贝必要文件到自己的项目中,如下图所示:

android studio写API接口程序 android studio接口调用_android ndk_04

图中画横线的 SerialPort.c 及 SerialPort.java 是必要文件,SerialPortFinder.java 用于查找串口设备,如果知道串口路径则无需导入。
将 SerialPort.c 文件拷贝到 src/main 目录下的 cpp 文件夹,没有则创建。

2、编辑 CMake 脚本,添加如下代码:

# 每次创建一个新的库,需要添加另一个 add_library() 脚本,每个add_library 脚本语句只能导入一个库
add_library(serial_port
            SHARED
            src/main/cpp/SerialPort.c)

如果同步报 Log 日志异常则需要给 .c 文件导入 Log 库,具体导入方法如下:

# 该语句可以给一个 .c 库文件导入多个依赖库
target_link_libraries( # Specifies the target library.
                       # add_library 生成的
                       serial_port

                       # Links the target library to the log library
                       # included in the NDK.
                       # find_library 找到的系统库
                       ${log-lib} )

默认是已经有导入 log-lib 库的,如果没有的话则需要在上面代码之前导入 log-lib 库,如下所示:

# find_library 定义当前代码库需要依赖的系统或者第三方库文件
find_library( # Sets the name of the path variable.
              # 指定要查找的系统库, 给一个名字
              log-lib

              # Specifies the name of the NDK library that
              # you want CMake to locate.
              # 真正要查找的liblog.so或者liblog.a
              log )

当完成以上步骤后,就已经完成文件的导入了。

三、串口通讯操作

此处只对串口读写进行简单封装,代码如下所示(代码为 Kotlin):

class SerialPortModule(file: File, baudrate: Int, flags: Int) {
    // 串口
    private var mSerialPort = SerialPort(file, baudrate, flags)

    /**
     * 写入串口数据
     */
    fun writePort(data:ByteArray) {
        doAsync {
            val mOutputStream = mSerialPort.outputStream
            try {
                mOutputStream.write(data)
                Log.i(javaClass.simpleName, "写入成功!")
            } catch (e: IOException) {
                Log.i(javaClass.simpleName, "写入失败!")
                e.printStackTrace()
            }
        }
    }

    /**
     * 读取串口数据
     *
     * @param callback 回调接口
     */
    fun readPort(callback: OnResultListener?) {
        doAsync {
            while (true){
                val size: Int
                val mInputStream = mSerialPort.inputStream
                try {
                    val buffer = ByteArray(256)
                    size = mInputStream.read(buffer)
                    if (size > 0)
                        Log.i(javaClass.simpleName, "接收到的数据:" + buffer.toString(Charset.defaultCharset()))
                    callback?.onReceived(buffer)
                    Log.i(javaClass.simpleName, "接收成功!")
                } catch (e: IOException) {
                    e.printStackTrace()
                    Log.i(javaClass.simpleName, "接收失败!")
                }
            }
        }
    }

    /**
     * 关闭串口
     */
    fun close() {
        mSerialPort.close()
    }

    /**
     * 结果监听器
     */
    interface OnResultListener {
        /**
         * 当接收到数据时
         *
         * @param data 接收的数据
         */
        fun onReceived(data: ByteArray)
    }
}

到此使用 android-serialport-api 进行串口通讯就介绍完毕,有问题可以在评论处留言。
感谢阅读!