Android通过JNI实现与C语言的串口通讯操作蓝牙硬件模块
一直想写一份技术文档,但因为自感能力有限而无从下笔,近期做了个关于Android平台下实现与C语言的通讯来操作蓝牙模块的项目,中间碰到了很多问题,也在网上查了很多资料,在完毕主要功能后。也有一些人在网上问我一些问题。这里写下这篇文档算是一个阶段性的总结。
假设反响好。兴许将会发上Android Stub与新版Android HAL的学习文档。
因为蓝牙模块是串口通讯机制。使用C语言来訪问,而Android的应用层採用Java。无法直接操作硬件。故使用JNI的技术实现主要功能。Android的JNI应该属于Android HAL的一部分,因为Android的HAL机制眼下还没全然摸索透,所以这里的程序架构算是老版本号的HAL机制。程序架构例如以下图。
一、 什么是JNI?
JNI是Java Native Interface的缩写,中文为JAVA本地调用。从Java1.1開始,Java Native Interface(JNI)标准成为java平台的一部分,它同意Java代码和其它语言写的代码进行交互。
JNI一開始是为了本地已编译语言。尤其是C和C++而设计的,可是它并最好还是碍你使用其它语言,仅仅要调用约定受支持就能够了。(以上内容摘自百度百科)
二、 怎样使用JNI?
1、在使用JNI之前,你要确保你的电脑中安装下面软件环境:
Android SDK :版本号与你硬件測试环境版本号同样,在Google的Android官网下载
Android NDK :用于编译C文件为.so的共享库。假设你是在Linux下进行开发而又具有Android的全然SDK,则不须要
Cygwin :用于编译C文件
Android 开发环境 :android开发环境的配置网上一大堆,这里不再赘述
2、程序中因为仅仅用到Java调C,而不须要C调Java,所以在应用层调C的函数非常easy,仅仅须要在一个方法前增加nativekeyword(native的方法不能有方法体),然后将编译的共享库导入就可以。
例如以下:
public class BluetoothJNI {
static{
System.loadLibrary("jni");
}
public native static int bluetoothOn(String strAT);
public native static void bluetoothOff(String strAT);
public native static String readSerial();
public native static void write(String strAT);
}
3、Eclipse在保存project后,会自己主动把Java文件编译为class文件。我们使用javah命令把class文件编译成C头文件。例如以下:
运行此命令后将会在project的bin文件夹下生成一个.h的C头文件。
头文件里会生成相应Java native方法的函数声明。
新建一个与头文件同名的C文件并实现全部函数。
4、因为Android的底层是基于Linux内核。所以一些Windows下的系统函数不可用。Linux下的串口通讯文章网上有非常多,此处代码繁多,就不贴出来了。。我们在C文件里引入jni.h与刚生成的头文件以确保JNI能调用。注意:整个程序的核心部分便是在此处,C语言与蓝牙模块的串口通讯处,我在此处碰到的问题也是最多的。
三、编译C文件
1、在Android-ndk-r5b\samples\下新建文件夹Bluetooth\jni,将C文件与头文件复制过来,新建Makefile。
例如以下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_C_INCLUDES := $(JNI_H_INCLUDE)
LOCAL_LDLIBS := -lm -llog
LOCAL_MODULE := jni
LOCAL_SRC_FILES := com_android_semisky_bluetooth_util_BluetoothJNI.c
include $(BUILD_SHARED_LIBRARY)
2、打开Cygwin bash shell,进入Bluetooth文件夹。运行ndk-build进行编译。
3、将libs/armeabi下生成的libjni.so文件拷入到Androidproject的libs/armeabi文件夹下。安装apk到开发板。运行程序。
四、可能出现的问题
1、串口读写权限的问题
网上的方法是在Java中获取su账号来改权限或者在init.rc中加入命令来改动权限最后编译成img烧录进开发板。而这两种方法我都没成功,最后没办法在dos下运行shell命令来改动
2、C文件的串口读写问题
我不知道是我的程序有问题还是蓝牙模块的问题,在蓝牙模块返回数据稍大的时候。会出现数据有时返回有时不返回的情况。
3、乱码问题
蓝牙返回的数据时而出现乱码,未解决。
4、串口号的问题
假设你open的时候返回的fd小于1,确保你的开发板串口号是否正确。协议是否正确,权限是否改动。
5、最大大大的问题
读取串口代码段的算法问题,优化问题,不然数据会返回不正常。
Android通过JNI实现与C语言的串口通讯操作蓝牙硬件模块的更多相关文章
- Android For JNI(五)——C语言多级指针,结构体,联合体,枚举,自定义类型
Android For JNI(五)--C语言多级指针,结构体,联合体,枚举,自定义类型 我们的C已经渐渐的步入正轨了,基础过去之后,就是我们的NDK和JNI实战了 一.多级指针 指针的概念我们在前面 ...
- Android For JNI(二)——C语言中的数据类型,输出,输入函数以及操作内存地址,内存修改器
Android For JNI(二)--C语言中的数据类型,输出,输入函数以及操作内存地址,内存修改器 当我们把Hello World写完之后,我们就可以迈入C的大门了,今天就来讲讲基本的一些数据类型 ...
- Android For JNI(一)——JNI的概念以及C语言开发工具dev-c++,编写你的第一个C语言程序,使用C启动JAVA程序
Android For JNI(一)--JNI的概念以及C语言开发工具dev-c++,编写你的第一个C语言程序 当你的Android之旅一步步的深入的时候,你其实会发现,很多东西都必须去和framew ...
- Android之——JNI配置C语言打印Logcat信息
转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47425073 这篇文章给大家介绍一下在JNI中怎样为C语言配置打印Logcat信息 ...
- android的JNI 、 NDK 学习!
转载的! Java Native Interface (JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互.JNI 是本地编程接口,它使得在 Java 虚拟机 (VM) ...
- Android使用JNI(从java调用本地函数)
当编写一个混合有本地C代码和Java的应用程序时,需要使用Java本地接口(JNI)作为连接桥梁.JNI作为一个软件层和API,允许使用本地代码调用Java对象的方法,同时也允许在Java方法中调用本 ...
- Android中JNI编程的那些事儿(1)
转:Android中JNI编程的那些事儿(1)http://mobile.51cto.com/android-267538.htm Android系统不允许一个纯粹使用C/C++的程序出现,它要求必须 ...
- android的JNI标准 android的NDK
转载的! Java Native Interface (JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互.JNI 是本地编程接口,它使得在 Java 虚拟机 (VM) ...
- Android Studio JNI开发入门教程
Android Studio JNI开发入门教程 2016-08-29 14:38 3269人阅读 评论(0) 收藏 举报 分类: JNI(3) 目录(?)[+] 概述 在Andorid ...
随机推荐
- springMVC 引入静态资源Js的方式
前两天项目出现了Js无法引入的情况,本篇博客先总结分析+批判自己犯的低级错,再说说几种访问静态资源的方式! 首先,由于在web.xml里面的servlet拦截匹配为<url-pattern> ...
- 利用json实现数据传输
JSON:JavaScript 对象表示法(JavaScript Object Notation). JSON 是存储和交换文本信息的语法.类似 XML. JSON 比 XML 更小.更快,更易解析. ...
- 常用jar包下载地址汇总
<常用开发包下载地址汇总> 下载Jackson http://www.java2s.com/Code/Jar/j/Downloadjacksonjar.htm 下载Simple Loggi ...
- Java连接SQLite数据库
下载java包:sqlite-jdbc-3.7.2.jar,放到java工程目录lib下 如下代码实例: import java.sql.*; import org.sqlite.JDBC; /** ...
- 【CF675C】Money Transfers(离散化,贪心)
http://www.cnblogs.com/chengsheng/p/5535316.html 题目大意:给你n个银行中的存款(负值表示借贷),是成环的,1跟n相接,这n个数的和为0.可以从i向i的 ...
- 【webstrom】webstrom打开多个项目,webstrom常用快捷键
1.webstrom打开多个项目 默认情况下一次只能打开一个项目,如果需要打开多个就按照下面的方法 File -> settings -> Directories -> Add Co ...
- 慕课爬虫实战 爬取百度百科Python词条相关1000个页面数据
http://www.imooc.com/learn/563 spider_main.py #!/usr/bin/python # coding=utf-8 #from baike_spider im ...
- SPOJ LIS2 - Another Longest Increasing Subsequence Problem(CDQ分治优化DP)
题目链接 LIS2 经典的三维偏序问题. 考虑$cdq$分治. 不过这题的顺序应该是 $cdq(l, mid)$ $solve(l, r)$ $cdq(mid+1, r)$ 因为有个$DP$. #i ...
- 洛谷—— P2880 [USACO07JAN]平衡的阵容Balanced Lineup
https://www.luogu.org/problemnew/show/P2880 题目背景 题目描述: 每天,农夫 John 的N(1 <= N <= 50,000)头牛总是按同一序 ...
- Python之Django-part 1
python manage.py syncdb 在django1.7已经被取代了:用python manage.py migrate 代替来移动库: 删除.卸载django 在cd /usr/lo ...