一、创建 NDK 项目
这里在 AndroidStudio 中使用的是 CMark 工具,下载方法如下图所示:
然后创建一个新项目,勾选 C++,如下图所示:
别忘记也要勾选:
确认以上都勾选后,开始创建项目。
注意:如果是中途项目需要导入 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、拷贝必要文件到自己的项目中,如下图所示:
图中画横线的 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 进行串口通讯就介绍完毕,有问题可以在评论处留言。
感谢阅读!