【Android论文栏目提醒】:网学会员Android论文为您提供【论文范文】基于Android平台的串口通信实现 - 其它管理文献参考,解决您在【论文范文】基于Android平台的串口通信实现 - 其它管理文献学习中工作中的难题,参考学习。
论文范文 题目基于
Android平台的串口通信实现 编辑司马小 摘要串口在数据通信中应用广泛但
Android SDK指定使用Java作为第三方应用开发语言这给C语言实现串口应用带来了困难。
虽然Google
Android已经发布了NDKNative Development Kit原生态开发包支持开发者用C/C语言开发
Android程序但目前官方提供的技术指导比较简略。
通过开发一个
Android下串口通信应用实例详细介绍了
Android NDK的开发流程帮助开发人员快速的完成平台搭建。
关键词AndroidNDKJNISDK串口 Serial Communication Based
Android Platform JIN Zhi-yi ZHANG Ji Vehicle College Tongji University Shanghai 201804 China Abstract: Serial communication is widely used in data communication but the
Android SDK uses the Java language as a designated third-party application development which makes it difficult to achieve serial applications with C language. Although Google
Android has released NDK Native Development Kitwhich supports the developer to develop
Android program with C/C languagebut the official technical guidance has been relatively brief. Through the development of serial communication under an
Android platform as an application example article gives a thoroughly description of the
Android NDK development process that can help developers quickly build platforms. Key words:
Android NDK JNI SDK serial
Android是Google推出的基于Linux的开源手机操作系统是一个专门针对移动设备设计的软件平台包括操作系统、中间件和一些关键应用。
它的软件架构包含四个层次从高到低分别为应用层、应用框架层、系统运行层和linux内核层如图1所示。
每一个
Android应用程序都在它自己的进程中运行都拥有一个独立的Dalvik虚拟机实例。
Android发布初期Google就表示其虚拟机Dalvik支持JNI编程方式也就是第三方应用完全可以使用JNI调用自己的C动态库但Google官方并没有明确表示支持开发者使用这种方法。
终于在2009年6月Google
Android发布了NDK它支持开发者使用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或是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软件和功能。
使用它我们可以方便的在Windows平台编译出Linux平台的库文件或应用程序。
2 安装和配置NDK开发环境 2.1 安装NDK 首先要完整安装SDK尽量升级至最新版本文中使用2.1版本的SDK。
然后下载NDK官网有三个版本分别是Windows、Mac OS Xintel、Linux32/64x86下载后解压即可使用。
文中使用Windows版本的NDK版本为
android-ndk-r5。
将它解压到某个目录下文中我们将NDK安装到D:androidandroid-ndk-r5目录中。
2.2 安装Cygwin 首先去Cygwin官网下载网络安装程序下载下来以后点击直接运行。
安装过程中最关键的是选择需要安装的包为支持
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-r5 export NDK 然后重新启动Cygwin。
输入cd NDK如果输出上面配置的/cygdrive/e/
android-ndk-r5信息则表明环境变量设置成功了。
接下来就可以用 Cygwin 来编译我们的NDK代码了。
3
Android NDK开发实例 开发实例是一个
Android平台上的收音机程序该应用通过调用串口API与外围收音机芯片通信进而控制收音机芯片完成搜台、显示等功能。
Android NDK开发一般有以下步骤 1 JNI接口设计 2 使用C/C实现本地方法 3 生成动态链接库 4 将动态链接库复制到Java工程生成.apk文件。
首先创建一个NDK工程然后在这个文件夹下建立jni和src两个目录jni用来存放我们的C文件src是调用C库的Java接口文件。
接着创建jni/SerialPort.c该文件的主要作用是完成串口的打开和关闭。
关键代码如下 JNIEXPORT jobject JNICALL Java_
android_serialport_SerialPort_openJNIEnv env jobject thiz jstring path jint baudrate …… / Opening device / const char path_utf env-GetStringUTFCharsenv path iscopy LOGDOpening serial port s path_utf fd openpath_utf O_RDWR O_DIRECT O_SYNC LOGDopen fd d fd env-ReleaseStringUTFCharsenv path path_utf …… / Configure device / …… struct termios cfg cfmakerawcfg cfsetispeedcfg speed cfsetospeedcfg speed 在文件中函数名这样定义 jobject JNICALL 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_port LOCAL_SRC_FILES : SerialPort.c LOCAL_LDLIBS: -llog include BUILD_SHARED_LIBRARY LOCAL_PATH:callmy-dir这句用来指定编译的路径通过调用宏my-dir获取到当前工作的路径。
includeCLEAR_VARS CLEAR_VARS这个变量是编译系统提供的用来指明一个GNU makefile文件添加这句主要的目的是清理所有的LOCAL_XXX比如LOCAL_MODULE、LOCAL_SRC_FILES等。
在每个新模块的开始处需要添加这句。
LOCAL_MODULE : serial_port这句定义了模块名称将来编译的库或者可执行程序就以此命名。
如果编译的是动态库或者静态库那么库名就是libserial_port.so或者libserial_port.a。
需要注意的是系统会在生成动态库或者静态库的时候自动添加lib的前缀。
LOCAL_SRC_FILES : SerialPort.c是列出需要编译的源码文件名。
这里不需要列出头文件和被包含文件因为编译系统会自动为你添加。
includeBUILD_SHARED_LIBRARY这句说明将来产生的库是共享库即动态链接库。
接着我们就可以在cygwin下编译生成库文件了。
如图2所示进入到工程目录下运行ndk-build命令生成了名为libserial_port.so的文件。
将该文件安装到工程目录下的libsarmeabi目录中。
然后在src目录下编写的serialport.java文件该文件用于JNI接口调用。
关键代码如下 public class SerialPort …… /open the serial port/ mFd opendevice.getAbsolutePath baudrate // JNI private native static FileDescriptor openString path int baudrate public native void close static System.loadLibraryserial_port private native static FileDescriptor openString path int baudrate这句申明带有native关键字说明该方法是本地方法。
System.loadLibraryserial_port这句就是用来加载我们的c动态库的。
上面声明方法的具体实现就在我们加载的库中。
在完成了上述工作后我们就可以针对具体应用来使用串口完成数据通信了。
文中通过按键搜台并显示出具体频段。
界面布局采用xml文件来声明主要包括两个Button和一个TextView视图。
在Button上添加了按键响应当按下Button时通过串口发送调频信号。
bforeward.setOnClickListenernew View.OnClickListener public void onClickView v try mOutputStream.write mOutputStream.writen catch IOException e e.printStackTrace TextView用于接收串口信息显示调频。
protected void onDataRecEivedfinal byte buffer final int size runOnUiThreadnew Runnable public void run if mReception null mReception.setTextnew Stringbuffer 0 size 同时添加了Menu当按下Menu键时可以选择“退出”或“关于”。
//添加菜单选项 Override public boolean onCreateOptionsMenuMenu menu menu.add0 0 0R.string.about menu.add0 1 1R.string.exit return true //实现选择菜单的动作 Override public boolean onOptionsItemSelectedMenuItem item int item_id item.getItemId switchitem_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组件支持”更完善。
参考文献 赵宏伟.
Android NDK开发环境实现与应用J.电脑知识与技术201035. 杨丰盛.
Android应用开发揭秘M.北京:机械工业出版社2010:484.
Android SDK DocumentEB/OL.http://developer.
android.com/guide/index.html.