毕业设计(论文)JAVA虚拟机在移动平台上的实现设计.doc

上传人:laozhun 文档编号:3976666 上传时间:2023-03-30 格式:DOC 页数:28 大小:1,004.50KB
返回 下载 相关 举报
毕业设计(论文)JAVA虚拟机在移动平台上的实现设计.doc_第1页
第1页 / 共28页
毕业设计(论文)JAVA虚拟机在移动平台上的实现设计.doc_第2页
第2页 / 共28页
毕业设计(论文)JAVA虚拟机在移动平台上的实现设计.doc_第3页
第3页 / 共28页
毕业设计(论文)JAVA虚拟机在移动平台上的实现设计.doc_第4页
第4页 / 共28页
毕业设计(论文)JAVA虚拟机在移动平台上的实现设计.doc_第5页
第5页 / 共28页
点击查看更多>>
资源描述

《毕业设计(论文)JAVA虚拟机在移动平台上的实现设计.doc》由会员分享,可在线阅读,更多相关《毕业设计(论文)JAVA虚拟机在移动平台上的实现设计.doc(28页珍藏版)》请在三一办公上搜索。

1、 毕业论文JAVA虚拟机在移动平台上的实现作 者:学 号:学院(系):经济管理系专 业:信息管理与信息系统硕士指导教师: 评 阅 人: 教授 助教 2005年 6月JAVA虚拟机在移动平台上的实现摘 要本文是一篇关于如何移植JAVA虚拟机到mFone平台的文章。总的来说,所谓JAVA虚拟机移植主要就是根据上下文语意修改、实现对应的native函数。本文将会解释什么是KVM,什么是mFone以及如何移植KVM 到mFone平台。首先我们会介绍一些基本概念,接着以一些具体示例来演示如何移植,例如javax.microedition.io包的移植。在需要的地方我们还会给出一些注意事项(例如:如何提升

2、性能)。总之我们的目标很明确:移植KVM到mFone平台,使得它尽可能快而且完整(不偏离KVM的设计目标)。注意:虽然本文主要描述如何移植SUN的KVM到mFone平台上,但思想并不局限于SUN的KVM。关键词:KVM,mFone,MIDP,CLDCImplement of java virtual machine on mobile platformAbstractThis page is about how to port JAVA virtual machine to mFone platform, also known as JVM porting. Generally speakin

3、g, the so-called JVM porting is mainly modify or implement the native functions by its context meaning.In this page well explain whats KVM, mFone and how to port KVM to mFone platform. At first well describe some basic concepts. And then, we will demonstrate how to port KVM by some samples in detail

4、s, such as the demonstration of javax.microedition.io package. Well provide some notes (eg: how to speed up the performance) in somewhere if it is needed.More specifically, our goal is to port the KVM to mFone platform, as “completely” and “fast” as possible without sacrificing the KVM design goals.

5、Note :This document will describe how to port the KVM to mFone platform,but the idea is not just related to SUNs KVM.Key words: KVM,mFone,MIDP,CLDC目 录1 引言11.1 为什么要移植11.2 研究述评11.2.1 业内动态11.2.2 待移植平台现状31.2.3也谈知识产权31.2.4 商业前景41.3 内容安排42 概览52.1 Java概览52.1.1 什么是Configuration52.1.2 什么是Profile62.1.3 J2me平台

6、结构62.1.4 Midlet运行流程72.2 mFone平台介绍82.3 包移植示例82.3.1 javax.microedition.io包概览82.3.2 SocketConnection的实现93 API函数移植133.1 MIDP API概述133.2常用的宏和函数143.3 MIDP API的实现153.3.1 分类及示例153.3.2 注意事项193.4 事件194 结论20参 考 文 献22致 谢231 引言手持设备一个吸引人的特点就是它是连网的,其实如果没有网络,手持设备将毫无用处。但即使有了网络,如果不能满足用户个性化安装程序的需求,手持设备也会变得毫无情趣。理由很简单,因

7、为不能满足用户个性化安装程序的需求就没有吸引人的内容。如果所需的程序以用户可选择的方式,通过网络下载到手机上,那情况就不一样了。但应用程序一般是运行在特定的操作系统上的,例如针对Unix操作系统编写的程序是不能跑在Windows操作系统上的。在嵌入式领域,操作系统是五花八门的,不同的手机厂商会选用不同的操作系统和芯片组,并且往往同一个手机厂商的不同型号的手机可能选用不同的操作系统,那么,提供应用程序下载的服务提供商以及程序或内容开发商,对于同一个应用,怎么能开发适合于这么多不同操作系统的各种版本的应用程序呢?他们怎么知道接受服务的手机使用的是什么样的操作系统呢?于是,具有跨平台特性的Java技

8、术就成为解决这一问题的最佳方案。但要想应用程序能够通过网络下载到手机上,网络必须有足够的带宽,而3G的出现恰恰解决了这个问题。因为3G的目标,就是希望能提供不同速率的多媒体业务,适应不同的应用环境和有线网络,能全球覆盖和漫游,系统容量极大,频谱效率非常高。所以,可以说3G的出现给JAVA的推广起了积极的推动作用。目前3G技术主要有WCDMA、CDMA2000、TD-SCDMA。1.1为什么要移植Java程序设计语言因为其跨平台的特性已成为目前在手机、PDA等嵌入式系统中越来越受欢迎的热门软件平台了1。然而,Java之所以能够跨平台,完全依赖于底层虚拟机的支持,而虚拟机是不能跨平台的,这就需要我

9、们的移植工作23。1.2 研究述评1.2.1 业内动态移动信息设备主要包括PDA和智能手机,现在和将来都还会有一部分设备处于PDA和智能手机交界处的位置,而智能手机的市场远比PDA要大得多。针对PDA的主要操作系统有:(1)Palm OS和Pocket C两大阵营。Palm OS来自PalmSource公司,是一个开放的系统,在PDA市场上占主导地位,已经有非常多的第三方厂商开发的应用和一大批非常忠实和狂热的用户。采用Palm OS的有Palm公司的Palm系列和Sony公司的Clie系列等(2)Pocket PC是微软及其合作伙伴Casio、Compaq、Hewlett Packard和Sy

10、mbol推出的,基于Win CE 3.0,也是一个开放的标准系统,功能可以扩展(以往的Win CE是一个封闭的不可扩展的系统),在这个平台上厂商可以自己开发软件。具体产品如Compaq的iPAQ等(3)Sharp公司Zaurus系列PDA采用Linux的一个针对嵌入式系统的版本。满足CDC的标准,预装了Personal Java的虚拟机在智能手机领域,主要的平台有:(1) Symbian的EPOC。EPOC最早由Psion开发,主要面向智能手机,它也有PDA的特征,Psion也是第一批主要的PDA厂商之一。Psion宣布EPOC的第一个版本是开放的OS,并向其它厂商授权,随后Psion与Eri

11、csson,Nokia,及稍后的Motorola建立了名为Symbian的联盟,目前主要股东为Motorola, Nokia, Panasonic, Psion和SonyEricsson, Symbian在欧洲有很好的基础,为大多数主要手机厂商所采用 Symbian向领先的软硬件开发商开放源代码-所谓的Platinum Programme。从Symbian OS 5起开始支持java,OS 6引入了Personal Java和Java Phone(在Personal Java基础上的一个扩展API,主要针对手机),OS 7开始支持CLDC和MIDP(部分基于6.0和6.1的产品也支持)(2)

12、微软的PocketPC 2002电话版和SmartPhone2002(又称Stinger)显然,PocketPC2002是有无线通信功能的PDA,SmartPhone2002是有智能处理功能的手机在前面提到的这些操作系统平台中:(1) Palm OS上已经有了MIDP的参考实现(但是并不是最适合PDA的Profile)(2) Symbian实现了CLDC和MIDP。作为智能手机的操作系统,可以说Symbian是理想的MIDP应用平台(3) Compaq在iPaq上已经实现了CDC(基于Pocket PC)(4) IBM在Pocket PC上实现了CLDC,CDC和MIDP(5) Sharp的Z

13、aurus实现了Personal Java(基于Linux)可以看到,在硬件条件较好的PDA上都可以实现CDC的标准。另外,由于这些主要操作系统平台都是开放的,基本可以相信,主要的移动信息设备操作系统都将一直提供J2ME的支持,但是具体支持哪个标准则并不一定死板地按照CLDC和CDC的最初定义。而是和设备的硬件条件和厂商的选择有关。1.2.2 待移植平台现状我们所要移植的平台是mFone,它是移软科技的产品。mFone是一个基于Linux的平台。移软科技于2004年12月被PalmSource收购。mFone将因PalmOS的界面,感受及数据兼容能力而加强,使全球各种类别的移动电话受益于Pal

14、mOS的易用性。PalmSource还计划开发基于mFone的Palm OS操作系统,把Palm OS的优势引入Linux社区,这些优势包括:获奖的友好用户界面、基于最佳的Palm OS及Be OS上的软件构架、大量的专业及消费者应用程序,以及一个充满激情与活力的、由2500万用户和36万注册开发人员组成的Palm OS社区。PalmSource希望与Linux社区结为合作伙伴, 从而帮助Linux在消费及企业级移动市场快速成长。中国市场以及世界其他市场的情况表明,Linux现在越来越被大家接受,因此提供这样一个平台和产品就是给客户带来了更多的选择范围,它就是PalmOS和Linux为客户提供

15、的产品。中国移软的应用程序目前广泛应用于全球最大的无线市场上的30多个电话型号上。1.2.3也谈知识产权当前,中国信息通信产业的规模已进入世界大国行列,但是与国际先进水平相比,在核心技术、综合效益等方面还存在较大差距,特别是缺乏创新能力与核心竞争力,大而不强。我们必须充分认识信息通信产业由大到强的转变是一个战略目标,做大不易,做强更难,只有积极开发有自主知识产权的原创性核心技术,提高核心竞争力,积极推进新技术应用与新产品开发才能实现电信业的持续发展。这是建立电信强国的必由之路。在全球经济中,标准对于决定参与各方在全球化进程中获益多少具有越来越重要的作用。在当今国际政治经济中的主导产业信息产业中

16、,对技术标准的竞争已经超越了技术革新竞争。目前,谁控制了市场上的事实标准并保护了知识产权,谁就是技术上的优胜者。我们必须懂得这样一个道理:只有有了自己的科学研究成果,才能具有自己的知识产权;只有有了自主知识产权,才能制订自己的标准;只有有了国家标准,才能发展自己的产业,开拓国内外市场时才能不受制于人,成为电信强国。“技术标准是什么?”一文指出,“在关税壁垒逐渐被拆除后,技术标准已经成为发达国家垄断和控制国际市场、保护和发展本国市场的最有效手段”。“技术与国家利益”调研报告也指出,对中国而言,实施标准战略是提升国家竞争力至关重要的核心环节。在知识产权和标准制订领域中国必须开展政府、研究机构和企业

17、之间的合作。通过加强企业之间的技术合作,建立技术联盟,逐步形成企业主导的行业协会和形成协会标准。通过积极参与国际标准制订工作,与发达国家企业展开技术合作,可以提高企业的核心竞争力和国际地位。而移软科技的mFone是一个完全具有知识产权的产品,所以即使从知识产权的角度考虑我们也有必要自己移植自己的虚拟机,而不是完全依赖于别人的技术帮助。1.2.4 商业前景Java在移动平台上的应用越来越热门,下面几条信息中可窥一斑: (1) 全世界已经有大约2亿部Java手机在使用,世界上几乎所有移动运营商都推出了基于Java技术的无线数据增值服务(2) 中国移动通信集团已经建立了无线Java增值服务体系,并推

18、出了“百宝箱”等服务品牌,包括游戏百宝箱、娱乐百宝箱、商务百宝箱、生活百宝箱等(3) 中国联通公司也正在其CDMA网络上建立无线Java增值服务体系(4) 2003年9月26日中国联通、北京振戎融通公司和Sun公司在人民大会堂宣布联合发起成立“UniJa技术联盟”,三方将在联通CDMA网络上的Java增值服务方面全面合作截止写这篇文章时,我们已完成在海尔一款手机上的移植,我们相信这款手机一定能够给海尔带来丰厚的利润。1.3 内容安排本文主要讲述SUN的KVM,核心API及扩展API在mFone平台上的移植,某些地方也许会提到其它相关技术。由于KVM采用标准C写成,故我们几乎不用做任何事情,真正

19、需要我们做的其实是其API的移植工作。全文将会以各种API移植为主线,中间贯穿相关技术。API分为两部分:CLDC和MIDP,其中的CLDC使用的函数mLinux全部提供所以我们并不需要做多少事,真正需要投入大量精力的是MIDP API 的移植。尽管如此我们还会以CLDC的javax.microedition.io包移植作为起点来介绍一些基本知识,形成一个整体认识,然后讨论需要移植的分为那几类以及如何移植。2 概览2.1 J2ME概览2.1.1 什么是Configuration所谓Configuration指为JVM 定义的最小的能力和库,使JVM足够小并且能够运行在相同级别的所有设备上。Co

20、nfiguration将基本运行时环境定义为一套核心类和一个运行在特定类型设备上的特定的 JVM。J2ME 有两种Configuration分别是 CLDC 和 CDC。其中CLDC 适合小型设备,而 CDC 适合大型设备。运行应用程序所需要的J2ME环境可以被动态地配置,而不用预先考虑该设备是否提供了运行某个应用程序所需的所有 Java 技术库。CLDC 是由 Java Community Process 创建的。正如Sun所定义的那样,它的标准是:“轻便、覆盖区域最小的 Java 构建块,适合小型的、有资源限制的设备”。CLDC 简要描述了高度限制设备上每个 J2ME 执行所要求的一套最基

21、本的库和 Java 虚拟机特征。CLDC 主要面向那些网络连接速度慢、能源有限(经常是电池供电)、具有大于等于 128 KB 的稳定内存、以及大于等于 32 KB 的不稳定内存的设备。CLDC 设备使用稳定内存来存储运行时库和 KVM,或存储为某个特殊设备创建的另一个虚拟机。不稳定内存被用来分配运行时的内存。 CDC被定义为一种包含CLDC 类的J2SE的简化版。CDC是建立在CLDC基础之上,并且为CLDC设备开发的应用程序也可以运行在CDC设备上。CDC 也是由 Java Community Process 开发的,它为用户的电子设备和嵌入式设备如智能电话、双向寻呼机、PDA、家用电器、销

22、售网络终端以及汽车导航系统等提供一种标准化的、轻便的、功能齐全的 Java 2 虚拟机构建块。2.1.2 什么是Profile所谓Profile指基于Java技术的API集合,作为Configuration的补充,它为某种设备领域提供特殊的服务,如蜂窝电话或个人数字助理。一个Profile定义了受支持设备的类型。Profile被构建在Configuration的顶部。由于Profile是特定于运行应用程序的,所以,某个Profile是与某种特定的Configuration相关联的。 常见的Profile有MIDP。MIDP 适合诸如蜂窝电话和寻呼机等移动设备。MIDP是建立在 CLDC 之上的

23、,并且提供一个标准的运行时环境,允许在终端用户设备上动态地部署新的应用程序和服务。MIDP 是一个公共的、为移动设备设计的工业标准Profile,它不依赖某个特定的商家。对于移动应用程序开发来说,它是一个完整的、受支持的基础Profile。MIDP主要定义了: (1) 显示工具包, 用户输入方法(2) 采用简单的面向记录数据库模型保证一致性数据存储(3) 采用CLDC 通用连接框架提供基于HTTP的网络连接2.1.3 J2me平台结构图1.1描述了J2me的平台结构(其中的移动信息设备Profile又称为MIDP)Java的整体架构主要由两部份组成,即虚拟机和应用程序接口API。位于Java虚

24、拟机之上的Java API包含了基本API与扩展API,而KVM则为这些API提供运行时环境。图1.1 J2me平台结构图J2ME被设计得更加模块化和可缩放化。J2ME通过在原有设备操作系统上建造3层结构,来实现模块化和可缩放化:(1) KVM:KVM是一种紧凑的、可移植的Java虚拟机,被设计为专门用在小型的,内存受限系统上。KVM基于宿主操作系统,一般按照某种J2ME的Configuration要求实现对应的KVM(2) Configuration层:这一层对于用户可见度要低一些,但对框架层非常重要。它定义了Java虚拟机的最小功能集和Java类库的最小集合(3) Profile层:这一层

25、对于用户和应用程序提供者来说是最常见的。它定义了Java虚拟机的最小功能集和Java类库的最小集合。Profile是基于特定的Configuration层实现的。针对特定Profile层开发的应用程序可以移植到其他支持相同Profile的设备上,一个设备可以支持多种Profile2.1.4 Midlet运行流程Midlet是一种小型应用程序4,主要运行在嵌入式java 虚拟机上,它有点象应用程序,但它又不同与应用程序的运行流程;从上可以获得关于midlet的更多内容。下图演示了midlet的运行流程:图1.2 midlet运行流程首先,Java文件被编译为class文件,接着经过预验证阶段得到

26、验证后的class文件,然后通过OTA或其他方式下载到目标设备上进行运行。与传统java程序不同的是KVM加载程序的时候只做了简单的验证工作,好多工作都交给了preverifier,这是因为嵌入式系统并不像PC那样拥有丰富的资源。2.2 mFone平台介绍mFone是一种基于linux内核的操作系统5,它分为mFone for Smart phones和mFone for Feature phones两种,本文只讲叙KVM在mFone for Smart phones上的移植。mFone for Smart phones平台由HardWare、mLinux OS、mGUI及应用组成,它有好多优

27、良特点,我们只关心与我们的移植相关的特点,归纳如下:(1) 采用mLinux作为操作系统,故我们可以使用绝大部分标准C函数,以及Posix标准函数(2) 采用mGUI作为图形化界面,而mGUI API很像Windows API6,故我们可以复用一部分KVM GUI API接口2.3 包移植示例下面以CLDC的javax.microedition.io包的移植作为起点,以介绍一些基本知识2.3.1 javax.microedition.io包概览javax.microedition.io包其实实现了一个通用连接框架(Generic Connection Framework简称GCF),是J2me

28、对外界沟通的基础,网络通讯、消息服务、蓝牙、文件系统、端口、SIM卡的存取、都是以GCF为基础发展起来的、GCF结构如图2.1所示:图. 结构体系的三个部分及其之间的关系也就是说,用户先向连接工厂传送一个URL地址,连接工厂会根据URL的内容,产生一个特殊的连接接口,出于通用的目的,此特殊连接接口会先转型为通用连接接口;用户则根据自己请求的类型自己将此通用接口转化为特殊接口。2.3.2 SocketConnection的实现下面我们将会以图.为向导,一步一步追到底层实现用户要想获得特殊连接接口一般通过类似下面的代码来实现特殊连接接口 conn=(特殊连接接口)Connector(“URL”);

29、其中的特殊连接接口视连接的类型而定,常见的有:http socket https file sms 等。为了简化讨论我们假定连接的类型为socket,URL为127.0.0.1:555。则上述的伪代码的具体形式就变为:SocketConnection conn=( SocketConnection)Connector.open(“socket:/127.0.0.1:555”);下面我们来看看这行代码是如何做到获得连接的Connector代码示意如下:01 public class Connector 02 03 public static Connection open(String spec

30、) throws IOException 04 if (spec = null) 05throw new IllegalArgumentException(spec is null);06int index = spec.indexOf(:);07if (index = -1) 08throw new IllegalArgumentException(could not find the protocol keywords);09String scheme = spec.substring(0, index);10Class connectionClass = findConnectionCl

31、ass(scheme.toLowerCase();11CreateConnection connection = null;12try 13connection = (CreateConnection)connectionClass.newInstance();14 catch (InstantiationException e) 15throw new ConnectionNotFoundException(cat instance the class);16 catch (IllegalAccessException e) 17throw new ConnectionNotFoundExc

32、eption(permission denied);1819spec = spec.substring(scheme.length()+1);20return connection.setParameters2(spec, READ_WRITE, false);21 22 private static Class findConnectionClass(String scheme) 23throws ConnectionNotFoundException 24String packageList = System.getProperty(microedition.connection.pkgs

33、);25if (packageList != null) 26int last = 0, index = packageList.indexOf(|), end = packageList.length();27while (last end) 28if (index = -1) index = end;29String className = packageList.substring(last, index) + . + scheme + .Connection;30try 31return (Class)Class.forName(className);32 catch (Excepti

34、on e) 33last = index + 1;34index = packageList.indexOf(|, last);353637try 38String className = .cms.connection. + scheme + .Connection;39return (Class)Class.forName(className);40 catch (ClassNotFoundException e) 41if (scheme.equals(file) 42try 43String className = .cms.connection.file.base.Connectio

35、n;44return (Class)Class.forName(className);45 catch (ClassNotFoundException e2) 464748throw new ConnectionNotFoundException(the protocol you provide isnt support yet);49 50 51 分析:字符串“socket:/127.0.0.1:555”被传给open后,通过第09行分析出其scheme为socket,然后open就会将此字符串当成一种协议。注意第10行:Class connectionClass = findConnect

36、ionClass(scheme.toLowerCase()获得SocketConnection完全通过此方法。由findConnectionClass实现可知,它先到指定位置(String packageList = System.getProperty(microedition.connection.pkgs))寻找socket包,如果找不到就到默认位置去找,如果仍然找不到则抛出异常。本例中,SocketConnection接口会在.cms.connection.socket包中找到对应实现(Connection),也即获得了连接。而 SocketConnection接口规定其对应实现必须实

37、现以下方法:public String getAddress() throws IOException;public String getLocalAddress() throws IOException;public int getLocalPort() throws IOException;public int getPort() throws IOException;public int getSocketOption(byte optname) throws IllegalArgumentException, IOException;public void setSocketOptio

38、n(byte optname, int optval) throws IllegalArgumentException, IOException;public void close() throws IOException;public DataInputStream openDataInputStream() throws IOException;public InputStream openInputStream() throws IOException;public DataOutputStream openDataOutputStream() throws IOException;pu

39、blic OutputStream openOutputStream() throws IOException;那么这些方法是如何实现的呢?我们以setSocketOption()为例进行介绍,相关代码列表如下: public void setSocketOption(byte optname, int optval)throws IllegalArgumentException, IOException checkOption(option);if (value 0) throw new IllegalArgumentException(Unsupported Socket Option);

40、ensureOpen();setSocketOptionImpl (option, value);private native void setSocketOptionImpl(int option, int value) throws IOException; 由此可见setSocketOption()调用了native方法setSocketOptionImpl(int option, int value),而该native方法在KVM中是通过本地代码用语言实现的7,其代码如下:KNIEXPORT KNI_RETURNTYPE_VOIDJava_cn_com_cms_socket_Conne

41、ction_setSocketOptionImpl( ) long option; long value; long fd = getSocketHandle(); option = (int)KNI_GetParameterAsInt(1); value = (int)KNI_GetParameterAsInt(2); if (setsockopt0 (fd, option, value) = -1) printf(“I/O Exception”);exit(0); KNI_ReturnVoid();int setsockopt0(int fd, int flag, int optval)

42、int level = SOL_SOCKET; int optsize = sizeof(optval); int optname; struct linger lbuf ; void * opttarget = (void *) & optval ; switch (flag) case 0: /* DELAY */ level = IPPROTO_TCP; optname = TCP_NODELAY; break; case 1: /* LINGER */ opttarget = (void *) &lbuf ; optsize = sizeof (struct linger); optn

43、ame = SO_LINGER; if (optval = 0) lbuf.l_onoff = 0; lbuf.l_linger = 0; else lbuf.l_onoff = 1; lbuf.l_linger = optval; break; case 2: /* KEEPALIVE */ optname = SO_KEEPALIVE; break; case 3: /* RCVBUF */ optname = SO_RCVBUF; break; case 4: /* SNDBUF */ optname = SO_SNDBUF; break; default: /* IllegalArgu

44、mentException */ KNI_ThrowNew(java/lang/IllegalArgumentException,); return -1; if (setsockopt(fd, level, optname, opttarget, optsize) = 0) else fprintf (stderr, setsockopt errno=%dn, errno); return -1; return ;在J2se中有一中机制称为JNI,其目的就是让java能够调用本地代码并传递参数,然而这种机制对嵌入式系统来说代价太大了,于是SUN专门针对此制定了新的KNI机制,而上面的代码锋使

45、用的就是这种机制,关于KNI的内容请查阅相关文档8。由上面的代码可知,Connection中的setSocketOption最终会调用到标准库函数setsockopt。从上面的内容可知,移植API主要就是用C语言实现其native方法,移植的大概步骤是:(1) 了解要移植的包的功能;(2) 找出其中native方法和其对应参考实现;(3) 其参考实现我们的平台库能支持吗?如果支持则不必修改,否则应按照其上语意用自己的平台库去实现。3 API函数移植前面我们已经知道,CLDC使用的函数mLinux全部提供,所以我们并不需要做多少事,真正需要投入大量精力的是MIDP API 的移植,本节将会从常用的宏和函数、要实现的接口分类及示例,注意事项等几方面来阐述。3.1 MIDP API概述移动信息设备简表(MIDP) 适合类似于蜂窝电话和寻呼机这样的设备9。MIDP建立在 CLDC 之上。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号