浅谈基于Android平台的串口通信实现.doc

上传人:99****p 文档编号:2028684 上传时间:2019-03-29 格式:DOC 页数:10 大小:32KB
下载 相关 举报
浅谈基于Android平台的串口通信实现.doc_第1页
第1页 / 共10页
浅谈基于Android平台的串口通信实现.doc_第2页
第2页 / 共10页
浅谈基于Android平台的串口通信实现.doc_第3页
第3页 / 共10页
浅谈基于Android平台的串口通信实现.doc_第4页
第4页 / 共10页
浅谈基于Android平台的串口通信实现.doc_第5页
第5页 / 共10页
点击查看更多>>
资源描述

1、浅谈基于 Android 平台的串口通信实现摘要:串口在数据通信中应用广泛,但 Android SDK指定使用Java作为第三方应用开发语言,这给 C语言实现串口应用带来了困难。虽然 Google Android已经发布了 NDK(Native Development Kit,原生态开发包) ,支持开发者用 C/C+语言开发 Android程序,但目前官方提供的技术指导比较简略。通过开发一个 Android下串口通信应用实例,详细介绍了 Android NDK的开发流程,帮助开发人员快速的完成平台搭建。关键词:Android;NDK;JNI;SDK;串口Android 是 Google推出的基

2、于 Linux的开源手机操作系统,是一个专门针对移动设备设计的软件平台,包括操作系统、中间件和一些关键应用。它的软件架构包含四个层次,从高到低分别为应用层、应用框架层、系统运行层和 linux内核层,如图 1所示。每一个 Android应用程序都在它自己的进程中运行,都拥有一个独立的 Dalvik虚拟机实例。Android发布初期,Google 就表示其虚拟机 Dalvik支持 JNI编程方式,也就是第三方应用完全可以使用 JNI调用自己的 C动态库,但 Google官方并没有明确表示支持开发者使用这种方法。终于在 2009年 6月,Google Android发布了 NDK,它支持开发者使用

3、 C/C+语言开发 Android程序。作为 Android SDK的一个附加组件提供,开发者必须先安装Android SDK方可使用 NDK。NDK 的目的是为了增加代码的重用性及加快程序的运行速度,这有利于开发者从其他系统上移植软件到 Android平台。1 Android NDK 简介在 Android上应用程序的开发大部分基于 Java语言来实现。要使用C或是 C+的程序或库,就需要使用 NDK来实现。NDK 是 Native Development Kit的简称。它是一个工具集,集成了 Android的交叉编译环境,并提供了一套比较方便的 Makefile,可以帮助开发者快速开发 C

4、或是 C+的动态库,并自动的将 so动态库和 java程序打包成 apk,在Android上运行。有两个理由使用 NDK:一是合理的重用现有的代码;二是在程序中某些关键的部分提高执行效率。Android NDK目前作为 Android SDK的一个附加组件提供,开发者须先安装 Android SDK方可使用 NDK。在 Windows平台下进行 NDK开发通常会采用 Cygwin。Cygwin 是一套可以运行在 Windows平台上的 UNIX/Linux模拟器。运行 Cygwin后会出现一个类似 Windows CMD的 Shell环境界面,可以使用大部分 Linux软件和功能。使用它我们可

5、以方便的在 Windows平台编译出 Linux平台的库文件或应用程序。2 安装和配置 NDK开发环境2.1 安装 NDK首先要完整安装 SDK,尽量升级至最新版本,文中使用 2.1版本的SDK。然后下载 NDK,官网有三个版本分别是 Windows、Mac OS X(intel)、Linux32/64(x86),下载后解压即可使用。文中使用 Windows版本的 NDK,版本为 android-ndk-r5。将它解压到某个目录下,文中我们将 NDK安装到 D:“android“android-ndk-r5目录中。2.2 安装 Cygwin首先去 Cygwin官网下载网络安装程序,下载下来以后

6、点击直接运行。安装过程中最关键的是选择需要安装的包,为支持 Android NDK的开发,选择 Default安装后再安装以下模块autoconf2.1、automake1.10、binutils、gcc-core、gcc4-core、gdb、pcre、pcre-devel、GNU awk。 下面开始将 Android NDK配置到 Cygwin中。运行 Cygwin,修改Cygwin目录下(/home/usrname)的.bash_profile 文件,在文件尾部加入如下代码,NDK=/cygdrive/d/android/android-ndk-r5export NDK然后重新启动 Cyg

7、win。输入 cd $NDK,如果输出上面配置的/cygdrive/e/android-ndk-r5信息,则表明环境变量设置成功了。接下来就可以用 Cygwin 来编译我们的 NDK代码了。3Android NDK 开发实例 开发实例是一个 Android平台上的收音机程序,该应用通过调用串口 API与外围收音机芯片通信,进而控制收音机芯片完成搜台、显示等功能。Android NDK 开发一般有以下步骤:1) JNI 接口设计;2) 使用 C/C+实现本地方法;3) 生成动态链接库;4) 将动态链接库复制到 Java工程,生成.apk 文件。首先,创建一个 NDK工程,然后在这个文件夹下建立

8、jni和 src两个目录,jni 用来存放我们的 C文件,src 是调用 C库的 Java接口文件。接着创建 jni/SerialPort.c,该文件的主要作用是完成串口的打开和关闭。JNIEXPORT jobject JNICALL Java_android_serialport_SerialPort_open(JNIEnv *env, jobject thiz, jstring path, jint baudrate) /* Opening device */const char *path_utf = (*env)-GetStringUTFChars(env, path, iscopy)

9、;LOGD(“Opening serial port %s“, path_utf);fd = open(path_utf, O_RDWR | O_DIRECT | O_SYNC);LOGD(“open() fd = %d“, fd);(*env)-ReleaseStringUTFChars(env, path, path_utf);/* Configure device */struct termios cfg;cfmakeraw(cfg);cfsetispeed(cfg, speed);cfsetospeed(cfg, speed);在文件中,函数名这样定义:jobject JNICALL

10、Java_android_serialport_SerialPort_open,这个是 JNI的标准,定义需要按照如下格式:Java_packagename_classname_methodname接着创建文件 jni/Android.mk.这个文件是我们本地 c代码的Makefile。文件内容LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE:= serial_portLOCAL_SRC_FILES := SerialPort.cLOCAL_LDLIBS:= -lloginclude $(BUILD_SHARED_LIB

11、RARY)LOCAL_PATH:=$(callmy-dir)这句用来指定编译的路径通过调用宏my-dir获取到当前工作的路径。include$(CLEAR_VARS) CLEAR_VARS这个变量是编译系统提供的用来指明一个 GNU makefile文件添加这句主要的目的是清理所有的LOCAL_XXX,比如 LOCAL_MODULE、LOCAL_SRC_FILES 等。在每个新模块的开始处需要添加这句。LOCAL_MODULE := serial_port这句定义了模块名称,将来编译的库或者可执行程序就以此命名。如果编译的是动态库或者静态库,那么库名就是 libserial_port.so或者

12、 libserial_port.a。需要注意的是系统会在生成动态库或者静态库的时候自动添加 lib的前缀。LOCAL_SRC_FILES := SerialPort.c是列出需要编译的源码文件名。这里不需要列出头文件和被包含文件,因为编译系统会自动为你添加。include$(BUILD_SHARED_LIBRARY)这句说明将来产生的库是共享库即动态链接库。接着,我们就可以在 cygwin下编译生成库文件了。如图 2所示,进入到工程目录下,运行 ndk-build命令,生成了名为 libserial_port.so的文件。将该文件安装到工程目录下的 libs“armeabi目录中。然后在 sr

13、c目录下编写的 serialport.java文件,该文件用于 JNI接口调用。关键代码public class SerialPort /*open the serial port*/mFd = open(device.getAbsolutePath(), baudrate);/ JNIprivate native static FileDescriptor open(String path, int baudrate);public native void close();static System.loadLibrary(“serial_port“);private native stat

14、ic FileDescriptor open(String path, int baudrate)这句申明,带有 native关键字,说明该方法是本地方法。System.loadLibrary(“serial_port“)这句就是用来加载我们的 c动态库的。上面声明方法的具体实现就在我们加载的库中。在完成了上述工作后,我们就可以针对具体应用来使用串口完成数据通信了。文中通过按键搜台,并显示出具体频段。界面布局采用 xml文件来声明,主要包括两个 Button和一个TextView视图。在 Button上添加了按键响应,当按下 Button时通过串口发送调频信号。bforeward.setOnC

15、lickListener(new View.OnClickListener() public void onClick(View v) try mOutputStream.write(+);mOutputStream.write(“n); catch (IOException e) e.printStackTrace(););TextView 用于接收串口信息,显示调频。protected void onDataRecEived(final byte buffer, final int size) runOnUiThread(new Runnable() public void run() i

16、f (mReception != null) mReception.setText(new String(buffer, 0, size););同时添加了 Menu,当按下 Menu键时可以选择“退出”或“关于” 。/添加菜单选项Overridepublic boolean onCreateOptionsMenu(Menu menu) menu.add(0, 0, 0,R.string.about);menu.add(0, 1, 1,R.string.exit);return true;/实现选择菜单的动作Overridepublic boolean onOptionsItemSelected

17、(MenuItem item) int item_id = item.getItemId();switch(item_id) case 0:case 1:MainMenu.this.finish();break;return true;编译运行该工程,就可以生成 apk文件了。将 apk文件和libserial_port.so安装到 Android平台后,运行该应用程序,运行结果如图所示。4 结论Android NDK使 C语言开发人员也能参与到 Android应用程序的开发中,增加代码的重用性。文中通过搭建串口应用的 C代码底层接口,验证了其平台的可用性。但目前 NDK还处于初级阶段,官方表示后期将提供更多的库,相信今后 Android会对“C 组件支持”更完善。参考文献:1 赵宏伟.Android NDK开发环境实现与应用J.电脑知识与技术,2010(35).杨丰盛.Android 应用开发揭秘M.北京:机械工业出版社,2010:484.Android SDK DocumentEB/OL.http:/

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文资料库 > 毕业论文

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。