欢迎来到天天文库
浏览记录
ID:48186452
大小:972.50 KB
页数:43页
时间:2020-01-18
《Led中间件开发.ppt》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、Android系统之中间件的开发英蓓特培训中心2011.3主要内容Android中间件简介JNI标准简介如何实现JNI源码下开发AndroidLed中间件NDK开发AndroidLed中间件一Android中间件简介什么是Android中间件?可以理解为操作系统与应用程序的沟通桥梁,处于Android系统架构中的第二层,包括:函数层(Library):函数层是一套C/C++库,既能通过JNI标准为上层应用提供本地函数接口,又能调用内核代码与操作系统交互,中间件的开发就是在这一层。虚拟机(VirtualMachine):虚拟机则为上层Java应
2、用提供运行环境。绿色部分为函数层,黄色部分为虚拟机二JNI简介什么是JNI?JNI(JavaNativeInterface)是本地编程接口,它使得在Java虚拟机(VM)内部运行的Java代码能够与其它编程语言编写的应用程序和库进行交互操作。JNI一般有以下一些应用场景:高性能要求:如一些图形的处理,运算量非常大,直接使用java是不能胜任;调用驱动:如调用一些外部系统接口的驱动--读卡器的驱动,OCI驱动;使用大内存:如进程内Cache,远远超过VM所能分配的内存;调用系统服务:如java调用搜索服务,搜索是由C/C++实现的。Androi
3、dJNI使用Android已实现的JNI动态库,需要额外连接动态库libnativehelper.so对于开发者自己实现的JNI动态库*.so文件可以与Java应用一起打包到apk文件中。由于Android的应用层是以Java语言开发的,使用下层c/c++库提供的服务时需使用JNI在Android源码中,主要的JNI代码(C++源文件)放在以下的路径中:frameworks/base/core/jni/。被编译成动态库libandroid_runtime.so三如何实现JNI实现JNI需要三个方面Android源代码开发实现JNI与NDK下实
4、现JNI有所不同,在源代码中需以下三点:1.在JNI文件中实现JNI本地方法;2.在JNI文件中将本地方法注册到系统3.在java代码中声明JNI函数。JNI本地方法实现JNI方法的核心是JNINativeMethod结构体,这个结构体规定了JNI函数的相关描述信息,在jni.h中定义如下:typedefstruct{constchar*name;/*JNI函数的名称*/constchar*signature;/*描述JNI函数的参数和返回值*/void*fnPtr;/*JNI函数对应的C语言的指针函数*/}JNINativeMethod;这
5、里值得注意的是JNINativeMethod的第二个成员,用字符串来表示JNI函数的参数和返回值Java的类型JNI的类型对应字母Java布尔类型(boolean)jboolean(8位无符号)ZJava字节(byte)jbyte(8位有符号)BJava字符(char)jchar(16位无符号)CJava短整型(short)jshort(16位有符号)SJava整型(int)jint(32位有符号)IJava长整型(long)jlong(64位有符号)JJava单精度浮点(float)jfloat(IEEE754,32位)FJava双精度浮点
6、(double)jdouble(IEEE754,64位)DJava对象jobjectLJava无返回值voidVJNI的数据类型及对应字母例如:staticJNINativeMethodmethods[]={{"add","(II)I",(void*)add},};对照表可知JNI函数add的类型是”(II)I”,表示两个参数都是整型,返回值也为整型。方法数组的注册JNINativeMethod类型的数组,需要完成系统注册才能够使用。staticintregisterNativeMethods(JNIEnv*env,constchar*cla
7、ssName,JNINativeMethod*gMethods,intnumMethods){}staticintregisterNatives(JNIEnv*env){}jintJNI_OnLoad(JavaVM*vm,void*reserved)以上三个函数从下到上依次调用,分别为Java类、平台、虚拟机注册本地JNI方法。JNI函数的声明在Java代码中,定义的函数由JNI实现时,需要指定函数为native。System.loadLibrary(“”);载入由JNI源文件生成的动态库,“”里的内容为so文件名去掉前面的lib和后面的.s
8、o。例如加载libsimplejni.so动态库,“”里为simplejni。应用程序使用JNI可以通过源代码中/development/samples/Simpl
此文档下载收益归作者所有