北大3g授课--jni与android下c和c++组件及ibinder等

上传人:第*** 文档编号:49350275 上传时间:2018-07-27 格式:PPT 页数:46 大小:485.50KB
返回 下载 相关 举报
北大3g授课--jni与android下c和c++组件及ibinder等_第1页
第1页 / 共46页
北大3g授课--jni与android下c和c++组件及ibinder等_第2页
第2页 / 共46页
北大3g授课--jni与android下c和c++组件及ibinder等_第3页
第3页 / 共46页
北大3g授课--jni与android下c和c++组件及ibinder等_第4页
第4页 / 共46页
北大3g授课--jni与android下c和c++组件及ibinder等_第5页
第5页 / 共46页
点击查看更多>>
资源描述

《北大3g授课--jni与android下c和c++组件及ibinder等》由会员分享,可在线阅读,更多相关《北大3g授课--jni与android下c和c++组件及ibinder等(46页珍藏版)》请在金锄头文库上搜索。

1、1Android的C/C+组件与JavaJNIJNI、AndroidAndroid与与JNIJNI、C/C+C/C+组件组件王家林 Do one thing at a time,and do it well! Email: From:北京大学软件与微电子学院2Android的快速发展及原因市场占有率: 2010年11月2日,Canalys研究公司周一 发布报告说,第三季度,Google Android已经成为全球第 二大智能手机软件平台。诺基亚的Symbian以37%的份额 居第一,Android为17%,排名第二。一年时间大约上升 了大约500%。工作岗位需求量:据 oDesk 2010年1

2、1月初来自全球招 聘市场的报告显示,Android平台开发者的需求量从2009 年10月到2010年10整整上升了710%。最热门的应用:智能手机、平板电脑(tablet)、包含机 顶盒(STB)在内的新兴产品领域。原因:开放 、免费、完整的生态系统、OHA支持3Android中C/C+开发意义Native C/C+支持独特的应用程序软件、硬件结合,双方均可获得巨大利润对手机生产商而言,Native C/C+与硬件基础结 合,形成独特的竞争优势。4Android C/C+组件是同时具有标 准化和可替换性的完美结构标准化和可替换性是一个产业成熟和强大的标志 。Interface的重要性:不知(C

3、/C+组建被替换) 而能使用。JNI:Java程序和C/C+程序相互沟通,扮演接 口的角色。Plug and PlayEasy to Change5JNI与Faade PatternGramma等人在Design Pattern一书中写道:The common design goal is to minimize the communication and dependencies between subsystems. This can be an import consequence when the client and the subsystem are implemented ind

4、ependently.One way to achieve the goal is to introduce a faade object that provides a single,simplified interface to the more general facilities of a subsystem.pDesign Pattern提到Faade Pattern的作用:1,It shields clients from subsystem components, thereby reducing the number of objects that clients deal w

5、ith and making the subsystem easier to use.2,It promotes weak compling between the subsystem and its clients.Often the components in a subsystem are strongly coupled.Weak coupling lets you vary the components of the system without affecting its clients. 6Android中JNI与Faade Pattern完 美组合JNI提供Android中上层

6、Java代码和库中C/C+ 交互的接口,降低Android应用程序和C/C+组建 之间的依赖性Faade Pattern提供了组建的高度可替换性, PnP(Plug and Play)。“a Faade object that provides a single,simplified interface to”7Android中JNI与Faade Pattern完 美组合示图8Android软件开发分工架构:设计规范的接口,达到标准化和可替换性 。发挥JNI作用。C/C+组件开发:采用Linux平台(一般使用 Ubuntu),需要ARM GNU/Linux交叉编译器, 使用OOP的方式开发。J

7、ava应用程序的开发:发挥C/C+组件的功能, 挖掘硬件的功能。9JNI开篇Java是跨平台的语言,但是有些时候仍然需要调 用本地代码,这些代码通常是由C/C+编写,也 可以是其它被支持的语言。Oracle公司提供的JNI是Java平台的一个非常强 大的接口。这个JNI接口提供了Java与操作系统 本地代码相互调用的功能。10最简单的Java调用C/C+代码的步 骤首先在Java类中声明一个声明为native的方法。使用Javah命令生成包含native方法声明的C/C+ 头文件。按照生成的C/C+头文件来写C/C+源文件。将C/C+源文件编译成动态连接库(DLL或者SO )。将动态连接库(D

8、LL或者SO)加入PATH环境变 量中。Java类中加载动态连接库(DLL或者SO),然后 调用声明的native方法。11最简单的Java调用C/C+代码的核 心步骤示例1,Java类文件:public class TestNativepublic native void sayHello();public static void main(String args)System.loadLibrary(“nativeCode”);TestNative testNative = new TestNative();testNative.sayHello();2,用Java的javah工具生成头文

9、件,主要内容如下:JNIEXPORT void JNICALL Java_TestNativesayHello(JNIEnv *, jobject);3,C/C+实现文件(jni.h和jni_md.h) nativeCode.cpp JNIEXPORT void JNICALL Java_TestNativesayHello(JNIEnv *, jobject)coutArray Get/SetFile Get/SetStaticField CallMethod/CallStaticMethod 等许多函数16jobject解析通过jni.h头文件可以看出:jobject其实是一个指 针,对应

10、于Java中对对象的引用;同时jni.h的定 义也符合Java中一切皆继承Object原则。如果Java中声明的是静态方法,则jobject传递的 为类本身这个对象,即clz.class;如果使用的是非 静态方法,则jobject传递的为类的实例化对象。17Java的类型在C/C+中的映射关系见JNI.pptx第十页18jclass的取得为了能够在C/C+中使用Java类,jni.h头文件中专门定义 了jclass类型来表示Java中的Class类。JNIEnv类中有如下几个简单的函数可以取得jclass:jclass FindClass(const char* clsName); jclas

11、s GetObjectClass(jobject obj); jclass GetSuperClass(jclass obj);findClass会在classpath系统环境变量下寻找类。传入完 整的类名,注意包与包之间使用/而不是.来分割。例如 :jclass cls_string = env-FindClass(“java/lang/String”);19访问Java类中的属性与方法在C/C+本地代码中访问Java端的代码,一个常见的应用就是获取类 的属性和方法。为了能够在C/C+中表示属性和方法,JNI在jni.h头 文件中定义了jfieldID和jmethodID类型来分别代表Jav

12、a端的属性和方 法。访问或设置Java属性的时候,首先要在本地代码中取得代表该Java 属性的jfieldID,然后才能在本地代码中进行Java属性操作;同样的 ,在我们使用Java端的方法时,也需要取得代表该方法的jmethodID 才能进行Java方法的调用。使用JNIEnv的:GetFieldID/GetMethodID GetStaticFieldID/GetStaticMethodID 来取得相应的jfieldID和jmethodID20GetFieldID/GetStaticFieldID GetMethodID/GetStaticMethodIDGetFieldID(jclass

13、 clazz, const char* name, const char* sign);GetStaticFieldID(jclass clazz, const char* name, const char* sign);GetMethodID(jclass clazz, const char* name, const char* sign);GetStaticMethodID(jclass clazz, const char* name, const char* sign);GetMethodID也能够取得构造函数的jmethodID。创建一 个Java对象时可以调用指定的构造方法,例如:e

14、nv- GetMethodID(data_Clazz, “”, “()V”);类似Java的Reflect机制,需要指定类和属性/方法名来取 得相应的jfieldID和jmethodID,ersign又是什么呢?21Sign是什么?见JNI.pptx22Sign签名见JNI.pptx23使用签名取得属性/方法ID的例子见JNI.pptx24解析对刚才的例子而言: 取得的property是int类型的,所以在签名中传入“I” 取得function的ID时:int function(int foo, Date date, int arr);( I Ljava/util/Date;I) I25使用j

15、avap命令产生签名JDK提供了javap这个工具来查看一个类的声明 ,可以通过javap设置输出每个属性/方法的签名 。Javap s p full Class Name -s表示输出签名信息 -p同-private,输出包括private访问权限的成员信息26取得Java属性/设置Java属性见JNI.pptx27Java方法的调用JNIEnv提供了众多的CallMethod和CallStaticMethod,还有 CallNonvirtualMethod函数。需要通过GetMethodID取得相应方法的 jmethodID来传入到上述的函数中。调用实例方法的三种形式:CallMethod

16、(jobject obj, jmethodID id, );CallMethodV(jobject obj, jmethodID id, va_list lst);CallMethodA(jobject obj, jmethodID id, jvalue* v);第一种是最常用的方式;第二种是当调用这个函数的时候有一个指向参数表的va_list变量时使用的;第三种是当调用这个函数的时候有一个指向jvalue或者jvalue数组的指针时使用的。调用静态方法的三种形式:CallMethod(jclass clazz, jmethodID id, );CallMethodV(jclass clazz, jmethodID id, va_list lst);CallMethodA(jclass cla

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

当前位置:首页 > 建筑/环境 > 工程造价

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号