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、最大大大的问题

读取串口代码段的算法问题,优化问题,不然数据会返回不正常。

时间: 2024-10-11 06:12:17

Android通过JNI实现与C语言的串口通讯操作蓝牙硬件模块的相关文章

[机器人开发_调试] Android手机通过OTG与Arduino主板进行串口通讯

提供下载:资料+测试代码+串口通讯软件

Android For JNI(二)——C语言中的数据类型,输出,输入函数以及操作内存地址,内存修改器

Android For JNI(二)--C语言中的数据类型,输出,输入函数以及操作内存地址,内存修改器 当我们把Hello World写完之后,我们就可以迈入C的大门了,今天就来讲讲基本的一些数据类型,函数之内的 我们先来看一张传播久远的图片' 一.各种数据类型介绍 整型 整形包括短整型.整形和长整形. 短整形 short a=1; 整形 一般占4个字节(32位),最高位代表符号,0表示正数,1表示负数,取值范围是-2147483648~2147483647,在内存中的存储顺序是地位在前.高位在

Android之——JNI与C语言常见术语

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47450717 库函数: |-  为了代码重用,在C语言中提供了一些常用的.用于执行一些标准任务(如输入/出)的函数,这些函数事先被编译,并生成目标代码,然后将生成的目标代码打包成一个库文件,以供再次使用.库文件中的函数被称为库函数,库文件被称为函数库. |-  在Windows中C语言库函数中的中间代码都是以.obj为后缀的,Linux中是以.o为后缀. 提示:单个目标代码是无法

Android使用JNI(从java调用本地函数)

当编写一个混合有本地C代码和Java的应用程序时,需要使用Java本地接口(JNI)作为连接桥梁.JNI作为一个软件层和API,允许使用本地代码调用Java对象的方法,同时也允许在Java方法中调用本地函数. 在Java端,开发者所需要做的仅仅是在连接本地函数的方法之前加上native关键字.这样VM就会去寻找这个本地函数. 1.从Java调用本地函数 从Java调用本地函数时,需要在类中定义一个带有native关键字的特有方法,作为连接本地代码的桥梁.通过这个定义,尝试调用本地方法时JVM会找

Android中JNI的使用

Android中JNI编程的那些事儿 首先说明,Android系统不允许一个纯粹使用C/C++的程序出现,它要求必须是通过Java代码嵌入Native C/C++——即通过JNI的方式来使用本地(Native)代码.因此JNI对Android底层开发人员非常重要. 如何将.so文件打包到.APK 让我们 先 从最简单的情况开始,假如已有一个JNI实现——libxxx.so文件,那么如何在APK中使用它呢? 在我最初写类似程序的时候,我会将libxxx.so文件push到/system/lib/目

Android(Java):jni源代码

public void onCreate(Bundle savedInstanceState)    {        super.onCreate(savedInstanceState);        Button btn = new Button(this);        btn.setText("测试ndk");        btn.setOnClickListener(new ButtonOnClickListener());        setContentView(

Android For JNI(六)——交叉编译,NDK概述以及文件结构,编写自己的第一个JNI工程

Android For JNI(六)--交叉编译,NDK概述以及文件结构,编写自己的第一个JNI工程 终于回到我们的android了,我们先要配置这个NDK的环境,但是之前,我们还要了解一下基本的术语 一.交叉编译 在一个平台下编译出另一个平台可以执行的二进制程序 CPU平台:ARM X86 MIPS(指令集) 系统平台:windows linux mac 原理:模拟另一个平台的特性去编译程序 源代码-->预编译-->编译-->链接-->可执行程序 工具链:一个工具使用自动调用下一

android的JNI 、 NDK 学习!

转载的! Java Native Interface (JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互.JNI 是本地编程接口,它使得在 Java 虚拟机 (VM) 内部运行的 Java 代码能够与用其它编程语言(如 C.C++ 和汇编语言)编写的应用程序和库进行交互操作. 1.从如何载入.so档案谈起 由于Android的应用层的类都是以Java写的,这些Java类编译为Dex型式的Bytecode之后,必须靠Dalvik虚拟机(VM: Virtual Mac

android的jni相关

android的jni相关 NDK Builder环境配置 NDK Builder下载地址: http://pan.baidu.com/s/1o6462gi Run->External Tools->External Tools Configurations- 双击Program添加一个tool Name: NDK_Builder(自己随便写什么都行) Location: D:\adt-bundle-windows-x86-20130917\android-ndk-r7b\ndk-build.