Led中间件开发PPT学习课件_第1页
Led中间件开发PPT学习课件_第2页
Led中间件开发PPT学习课件_第3页
Led中间件开发PPT学习课件_第4页
Led中间件开发PPT学习课件_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、安卓中间件开发,英特尔培训中心,2011年3月1日,主要内容,安卓中间件简介,JNI标准简介,如何在JNI源代码下实现安卓Led中间件开发,安卓Led中间件的NDK开发,2,安卓中间件简介,3,什么是安卓中间件?可以理解为操作系统和应用程序之间的通信桥梁,位于安卓系统架构的第二层,包括:功能层(Library):功能层是一套C/C库,它不仅可以通过JNI标准为上层应用程序提供本地功能接口,还可以调用内核代码与操作系统进行交互,中间件的开发就在这一层。虚拟机:虚拟机为上层的Java应用程序提供运行环境。绿色部分是功能层,黄色部分是虚拟机。JNI简介,什么是JNI?JNI(Java Native

2、Interface)是一个本地编程接口,它使运行在Java虚拟机中的Java代码能够与用其他编程语言编写的应用程序和库进行交互。对于一些应用场景:JNI通常有以下高性能要求:例如,一些图形处理的计算量非常大,直接使用java是不够的;调用驱动:比如调用一些外部系统接口驱动读卡器驱动、OCI驱动;使用大内存:例如进程内缓存,它远远超过虚拟机可以分配的内存;调用系统服务:例如,java调用搜索服务,搜索是通过C/C实现的.6、Android JNI,使用Android实现的JNI动态库,需要连接动态库libnativehelper。因此,开发人员实现文件可以与Java应用程序一起打包到apk文件中

3、。因为安卓的应用层是用Java语言开发的,所以在使用底层c/c库提供的服务时应该使用JNI。在安卓源代码中,主要的JNI代码(C源文件)放在以下路径中:框架/基础/核心/jni/。编译成动态库libandroid_runtime.so,7,3。如何认识JNI、8、JNI需要三个方面。安卓源代码中JNI的开发和实现与NDK不同。源代码中需要以下三点:9、JNI本地方法。JNI方法的核心是间接方法结构。该结构指定了JNI函数的相关描述信息,在jni.h中定义如下:typedef struct const char * name/* JNI函数的名称*/const char*签名;/*描述JNI函数

4、的参数和返回值*/void * fnPtr;/* c语言的指针函数对应/*JNI函数*/jinitimemethod;这里值得注意的是JNI方法的第二个成员,它使用字符串来表示JNI函数、10、JNI数据类型和相应的字母的参数和返回值,例如:静态JNI方法方法=add、(ii) I、(void *) add、根据对照表,JNI函数加的类型是“(二)一”,这意味着两个参数都是整数,返回值都是整数。11、方法数组注册,JNINativeMethod类型数组,只能在系统注册完成后使用。静态内部注册方法(jniEnv* env,const char* className,JNINativeMethod

5、 * gMethods,Int num methods)静态内部注册本地方法(Jnev * env)Jin JNI _ onload(javavm * VM,void * reserved)以上三个函数是自下而上调用的,分别为Java类、平台和虚拟机注册本地JNI方法。12、JNI函数声明,在Java代码中,当已定义的函数由JNI实现时,有必要将该函数指定为本机函数。system . LoadLibrarY( );加载由JNI源文件生成的动态库。“”中的内容是这样的文件名,以及前面的lib和后面的。因此被移除。例如,加载libsimplejni.so动态库,而simplejni在 。、13、应

6、用程序使用JNI,可以通过源代码中的例程/开发/示例/简单JNI对其进行分析。目录结构如下:|-simple JNI |-JNI目录|-native . cppjni源文件| - Android.mk脚本文件。如何将cpp文件编译到编译系统| - srcsrc目录,与Eclipse项目下的src相同| - Android.mk脚本文件,描述如何编译整个项目| - AndroidManifest配置文件,与Eclipse项目下的相同。14、应用程序使用JNI。解析顶级的Android.mk文件local _ PACKAGE _ name :=simple jni/生成包的名称local _ JN

7、I _ shared _ libsimplejni/生成JNI共享库的名称include $(BUILD_PACKAGE) /编译include $(callall-makefiles-under,$(local _ path)/调用较低的makefile、15,应用程序使用JNI。分析安卓. mk文件local _ src _ files:=native。CPP/JNI的C源文件包含$(build _ shared _ library)/以共享库的方式编译,16,并且应用程序使用JNI。本地. cpp /定义JAVA方法添加静态金添加(jnienv * env,Jobject Thiz,Ji

8、nt A,Jint B)/本地实现方法列表静态金方法=添加,(ii) I,(void *)添加,/三个已注册的函数静态Int registernativenmethods(jnienv * env,constchar * classname,jninitivemethod * gmethods,Int num methods)静态Int register native(jnienv * env)jintni _ onload(javavm * VM,void * reserved),17,应用程序使用jni,simplejni.java类本机静态system . loadlibrary(sim

9、ple JNI);/加载native.cpp生成的动态库,全名是libsimple JNI.o静态native int add (int a,int b);/声明在动态库中实现的JNI函数add,供JAVA调用。18、应用程序使用JNI。编译SimpleJNI模块$ CD/usr/local/src/emobile/emb9 g 45/Android-2.1 _ R2 $ soucebuild/env setup . sh $ choose combo 11 sam9 g 45 eng $ mmm development/samples/SimpLejni由SimpleJNI.apk在AnDr

10、oid-2.1 _ R2/out/target/product/sam9 g 45/system/app安装在AnDroid系统中。19、4源代码开发LED中间件,20、开发元素,中间件是操作系统和应用程序之间的通信桥梁,所以除了应用层代码和Linux内核代码1实现JNI以外,其他所有内容都是LED中间件开发,为上层的Java应用提供功能接口。2.实现本地C/C代码,调用内核代码提供的发光二极管驱动程序。21,发光二极管中间件开发结构图,红色部分是中间件开发内容1。上层应用程序调用JNI 2提供的本机函数接口。硬件抽象层根据设备驱动文件22调用内核代码,实现发光二极管中间件的JNI方法。下面的

11、JNI方法应该在JNI的cpp源文件中实现,本机函数是为Java代码提供的本地程序接口。打开和关闭函数对应领先设备文件的打开与关闭,开关函数对应领先的亮灭选择,get_state函数是获取领先的当前状态:静态jninativmethod ledsCtrlmethods=native _ open,()I,(void *)Android _ emobile _ ledDevice _ open,native_close,()I,(void *)Android _ emobile _ ledDevice _ close,native_switch_on_off,(II)I,(void *)Andr

12、oid _ emobile _ ledDevice _ switch _ on _ off,native_get_state,(I),(void *)Android _ emobile _ ledDevice _ get _ state;23、实现领先中间件的JNI注册,JNI的注册函数只需修改登记注册函数中调用注册注册方法时的参数,参数类名为自己定义的爪哇岛类的路径类路径名,参数通用方法为自己JNI方法数组名ledsCtrlmethods,其余函数注册方法,JNI _在线不变:静态int registerstantions(Jnienv * env)if(!idspninfopath _ N

13、V)注册方法(env,classPathName,ledsCtrlmethods,sizeof(ledsCtrlmethods)/sizeof(ledsCtrlmethods 0)返回JNI _假;返回JNI真;24、发光二极管中间件JNI的声明,JNI的声明在框架层爪哇岛文件中,还要加载因此文件,注意参数名为ledsctrl_jni,前面没有lib,后面没有。所以:公共类静态系统。LoadLibrary/加载本地库公共静态本机int native_open() /JNI的声明,注意当地的关键字公共静态本机int native _ close();公共静态本机int native_switch

14、_on_off(int num,int on _ off);/* */公共静态本机int native _ get _ state(int num);25、硬件抽象层,发光二极管中间件的最终目的是去控制开发平台上的灯D7、D8、所以JNI需要调用领先硬件抽象层代码与内核通信,而不是像SimpleJNI那样把结果返回给爪哇岛函数就结束了led .硬件抽象层头文件leds_hal.h定义结构体:struct leds_ctrl_dev_t /通过此结构体JNI调用硬件抽象层函数int (*open)(无效);int (*close)()无效);int (*switch_on_off)(整数,整数状

15、态);int(* get _ state)(int num);结构LEDs _ ctrl _ dev _ t * get _ LEDs _ ctrl _ dev(无效);26、硬件抽象层,硬件抽象层的c文件leds_hal.c定义结构成员get _ LEDs _ ctrl _ dev:静态结构LEDs _ ctrl _ dev _ t ledstcrdevice=/定义结构体成员函数open: leds_ctrl_open,close : leds_ctrl_close,switch _ on _ off : LEDs _ ctrl _ switch _ on _ off,get _ stat

16、e : LEDs _ ctrl _ get _ LEDs _ state;结构LEDs _ ctrl _ dev _ t * get _ LEDs _ ctrl _ dev(无效)返回、27、硬件抽象层,JNI的cpp源文件通过包含头文件leds_hal.h,调用硬件抽象层打开函数方法如下,其余函数调用也是如此静态结构leds _ ctrl _ dev _ t *空;静态jint AnDroid _ emobile _ LedDevice _ open(Jnie NV * env,jclass clazz)Ledsctr lev=get _ LEDs _ ctrl _ dev();如果LOGD失败了!)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论