毕业设计(论文)-JAVA虚拟机在移动平台上的实现设计.doc_第1页
毕业设计(论文)-JAVA虚拟机在移动平台上的实现设计.doc_第2页
免费预览已结束,剩余26页可下载查看

下载本文档

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

文档简介

毕业论文 java 虚拟机在移动平台上的实现 作作 者者: 学学 号:号: 学院学院(系系):经济管理系 专专 业业:信息管理与信息系统 指导教师:指导教师: 评评 阅阅 人:人: 2005 年 6 月 硕士 助教 教授 中北大学 2005 届本科毕业论文 java 虚拟机在移动平台上的实现 摘摘 要要 本文是一篇关于如何移植 java 虚拟机到 mfone 平台的文章。总的来说,所谓 java 虚拟机移植主要就是根据上下文语意修改、实现对应的 native 函数。 本文将会解释什么是 kvm,什么是 mfone 以及如何移植 kvm 到 mfone 平台。 首先我们会介绍一些基本概念,接着以一些具体示例来演示如何移植,例如 javax.microedition.io 包的移植。在需要的地方我们还会给出一些注意事项 (例如:如何提升性能)。总之我们的目标很明确:移植 kvm 到 mfone 平台,使 得它尽可能快而且完整(不偏离 kvm 的设计目标)。 注意:虽然本文主要描述如何移植 sun 的 kvm 到 mfone 平台上,但思想并不 局限于 sun 的 kvm。 关键词:kvm,mfone,midp,cldc 中北大学 2005 届本科毕业论文 implement of java virtual machine on mobile platform abstract this page is about how to port java virtual machine to mfone platform, also known as jvm porting. generally speaking, 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 details, 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. 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 中北大学 2005 届本科毕业论文 第 i 页 共 i 页 目目 录录 1 引言1 1.1 为什么要移植1 1.2 研究述评1 1.2.1 业内动态1 1.2.2 待移植平台现状3 1.2.3 也谈知识产权3 1.2.4 商业前景4 1.3 内容安排4 2 概览5 2.1 java 概览5 2.1.1 什么是 configuration5 2.1.2 什么是 profile6 2.1.3 j2me 平台结构6 2.1.4 midlet 运行流程 7 2.2 mfone 平台介绍8 2.3 包移植示例8 2.3.1 javax.microedition.io 包概览8 2.3.2 socketconnection 的实现9 3 api 函数移植13 3.1 midp api 概述13 3.2 常用的宏和函数14 3.3 midp api 的实现15 3.3.1 分类及示例15 3.3.2 注意事项19 3.4 事件19 4 结论20 参 考 文 献22 致 谢23 中北大学 2005 届本科毕业论文 第 1 页 共 23 页 1 1 引言引言 手持设备一个吸引人的特点就是它是连网的,其实如果没有网络,手持设备将 毫无用处。但即使有了网络,如果不能满足用户个性化安装程序的需求,手持设 备也会变得毫无情趣。理由很简单,因为不能满足用户个性化安装程序的需求就 没有吸引人的内容。如果所需的程序以用户可选择的方式,通过网络下载到手机 上,那情况就不一样了。 但应用程序一般是运行在特定的操作系统上的,例如针对unix操作系统编写 的程序是不能跑在windows操作系统上的。在嵌入式领域,操作系统是五花八门的, 不同的手机厂商会选用不同的操作系统和芯片组,并且往往同一个手机厂商的不 同型号的手机可能选用不同的操作系统,那么,提供应用程序下载的服务提供商 以及程序或内容开发商,对于同一个应用,怎么能开发适合于这么多不同操作系 统的各种版本的应用程序呢?他们怎么知道接受服务的手机使用的是什么样的操 作系统呢?于是,具有跨平台特性的java技术就成为解决这一问题的最佳方案。 但要想应用程序能够通过网络下载到手机上,网络必须有足够的带宽,而3g 的出现恰恰解决了这个问题。因为3g的目标,就是希望能提供不同速率的多媒体 业务,适应不同的应用环境和有线网络,能全球覆盖和漫游,系统容量极大,频 谱效率非常高。所以,可以说3g的出现给java的推广起了积极的推动作用。目前 3g技术主要有wcdma、cdma2000、td-scdma。 1.11.1 为什么要移植为什么要移植 java 程序设计语言因为其跨平台的特性已成为目前在手机、pda 等嵌入式系 统中越来越受欢迎的热门软件平台了1。然而,java 之所以能够跨平台,完全依 赖于底层虚拟机的支持,而虚拟机是不能跨平台的,这就需要我们的移植工作23。 1.21.2 研究研究述评述评 1.2.1 业内动态 移动信息设备主要包括 pda 和智能手机,现在和将来都还会有一部分设备处 于 pda 和智能手机交界处的位置,而智能手机的市场远比 pda 要大得多。 针对 pda 的主要操作系统有: 中北大学 2005 届本科毕业论文 第 2 页 共 23 页 (1)palm os 和 pocket c 两大阵营。palm os 来自 palmsource 公司,是一个 开放的系统,在 pda 市场上占主导地位,已经有非常多的第三方厂商开 发的应用和一大批非常忠实和狂热的用户。采用 palm os 的有 palm 公司 的 palm 系列和 sony 公司的 clie 系列等 (2)pocket pc 是微软及其合作伙伴 casio、compaq、hewlett packard 和 symbol 推出的,基于 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 与 ericsson,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)微软的 pocketpc 2002 电话版和 smartphone2002(又称 stinger)显然, pocketpc2002 是有无线通信功能的 pda,smartphone2002 是有智能处理 功能的手机 在前面提到的这些操作系统平台中: (1)palm os 上已经有了 midp 的参考实现(但是并不是最适合 pda 的 profile) (2)symbian 实现了 cldc 和 midp。作为智能手机的操作系统,可以说 symbian 是理想的 midp 应用平台 中北大学 2005 届本科毕业论文 第 3 页 共 23 页 (3)compaq 在 ipaq 上已经实现了 cdc(基于 pocket pc) (4)ibm 在 pocket pc 上实现了 cldc,cdc 和 midp (5)sharp 的 zaurus 实现了 personal java(基于 linux) 可以看到,在硬件条件较好的 pda 上都可以实现 cdc 的标准。另外,由于这 些主要操作系统平台都是开放的,基本可以相信,主要的移动信息设备操作系统 都将一直提供 j2me 的支持,但是具体支持哪个标准则并不一定死板地按照 cldc 和 cdc 的最初定义。而是和设备的硬件条件和厂商的选择有关。 1.2.2 待移植平台现状 我们所要移植的平台是 mfone,它是移软科技的产品。mfone 是一个基于 linux 的平台。移软科技于 2004 年 12 月被 palmsource 收购。mfone 将因 palmos 的界 面,感受及数据兼容能力而加强,使全球各种类别的移动电话受益于 palmos 的易 用性。palmsource 还计划开发基于 mfone 的 palm os 操作系统,把 palm os 的优 势引入 linux 社区,这些优势包括:获奖的友好用户界面、基于最佳的 palm os 及 be os 上的软件构架、大量的专业及消费者应用程序,以及一个充满激情与活 力的、由 2500 万用户和 36 万注册开发人员组成的 palm os 社区。palmsource 希 望与 linux 社区结为合作伙伴, 从而帮助 linux 在消费及企业级移动市场快速成 长。中国市场以及世界其他市场的情况表明,linux 现在越来越被大家接受,因 此提供这样一个平台和产品就是给客户带来了更多的选择范围,它就是 palmos 和 linux 为客户提供的产品。中国移软的应用程序目前广泛应用于全球最大的无 线市场上的 30 多个电话型号上。 1.2.3 也谈知识产权 当前,中国信息通信产业的规模已进入世界大国行列,但是与国际先进水平 相比,在核心技术、综合效益等方面还存在较大差距,特别是缺乏创新能力与核 心竞争力,大而不强。我们必须充分认识信息通信产业由大到强的转变是一个战 略目标,做大不易,做强更难,只有积极开发有自主知识产权的原创性核心技术, 提高核心竞争力,积极推进新技术应用与新产品开发才能实现电信业的持续发展。 这是建立电信强国的必由之路。在全球经济中,标准对于决定参与各方在全球化 进程中获益多少具有越来越重要的作用。在当今国际政治经济中的主导产业 信息产业中,对技术标准的竞争已经超越了技术革新竞争。目前,谁控制了市场 中北大学 2005 届本科毕业论文 第 4 页 共 23 页 上的事实标准并保护了知识产权,谁就是技术上的优胜者。我们必须懂得这样一 个道理:只有有了自己的科学研究成果,才能具有自己的知识产权;只有有了自 主知识产权,才能制订自己的标准;只有有了国家标准,才能发展自己的产业, 开拓国内外市场时才能不受制于人,成为电信强国。 “技术标准是什么?”一文指出,“在关税壁垒逐渐被拆除后,技术标准已 经成为发达国家垄断和控制国际市场、保护和发展本国市场的最有效手段”。 “技术与国家利益”调研报告也指出,对中国而言,实施标准战略是提升国家竞 争力至关重要的核心环节。在知识产权和标准制订领域中国必须开展政府、研究 机构和企业之间的合作。通过加强企业之间的技术合作,建立技术联盟,逐步形 成企业主导的行业协会和形成协会标准。通过积极参与国际标准制订工作,与发 达国家企业展开技术合作,可以提高企业的核心竞争力和国际地位。 而移软科技的mfone是一个完全具有知识产权的产品,所以即使从知识产权的 角度考虑我们也有必要自己移植自己的虚拟机,而不是完全依赖于别人的技术帮 助。 1.2.4 商业前景 java 在移动平台上的应用越来越热门,下面几条信息中可窥一斑: (1) 全世界已经有大约 2 亿部 java 手机在使用,世界上几乎所有移动运营 商都推出了基于 java 技术的无线数据增值服务 (2) 中国移动通信集团已经建立了无线 java 增值服务体系,并推出了“百 宝箱”等服务品牌,包括游戏百宝箱、娱乐百宝箱、商务百宝箱、生活 百宝箱等 (3) 中国联通公司也正在其 cdma 网络上建立无线 java 增值服务体系 (4) 2003 年 9 月 26 日中国联通、北京振戎融通公司和 sun 公司在人民大会 堂宣布联合发起成立“unija 技术联盟”,三方将在联通 cdma 网络上 的 java 增值服务方面全面合作 截止写这篇文章时,我们已完成在海尔一款手机上的移植,我们相信这款手 机一定能够给海尔带来丰厚的利润。 1.31.3 内容安排内容安排 本文主要讲述 sun 的 kvm,核心 api 及扩展 api 在 mfone 平台上的移植, 中北大学 2005 届本科毕业论文 第 5 页 共 23 页 某些地方也许会提到其它相关技术。由于 kvm 采用标准 c 写成,故我们几乎不 用做任何事情,真正需要我们做的其实是其 api 的移植工作。全文将会以各种 api 移植为主线,中间贯穿相关技术。 api 分为两部分:cldc 和 midp,其中的 cldc 使用的函数 mlinux 全部提 供所以我们并不需要做多少事,真正需要投入大量精力的是 midp api 的移植。 尽管如此我们还会以 cldc 的 javax.microedition.io 包移植作为起点来介绍一些基 本知识,形成一个整体认识,然后讨论需要移植的分为那几类以及如何移 植。 2 2 概览概览 2.12.1 j2me 概览概览 2.1.1 什么是 configuration 所谓configuration指为jvm 定义的最小的能力和库,使jvm足够小并且能够 运行在相同级别的所有设备上。configuration将基本运行时环境定义为一套核心类 和一个运行在特定类型设备上的特定的 jvm。j2me 有两种configuration分别是 cldc 和 cdc。其中cldc 适合小型设备,而 cdc 适合大型设备。运行应用 程序所需要的j2me环境可以被动态地配置,而不用预先考虑该设备是否提供了运 行某个应用程序所需的所有 java 技术库。 cldc 是由 java community process 创建的。正如 sun 所定义的那样,它的 标准是:“轻便、覆盖区域最小的 java 构建块,适合小型的、有资源限制的设 备”。cldc 简要描述了高度限制设备上每个 j2me 执行所要求的一套最基本的 库和 java 虚拟机特征。cldc 主要面向那些网络连接速度慢、能源有限(经常 是电池供电)、具有大于等于 128 kb 的稳定内存、以及大于等于 32 kb 的不 稳定内存的设备。cldc 设备使用稳定内存来存储运行时库和 kvm,或存储为 某个特殊设备创建的另一个虚拟机。不稳定内存被用来分配运行时的内存。 cdc 被定义为一种包含 cldc 类的 j2se 的简化版。cdc 是建立在 cldc 基 础之上,并且为 cldc 设备开发的应用程序也可以运行在 cdc 设备上。cdc 也 是由 java community process 开发的,它为用户的电子设备和嵌入式设备如智能 中北大学 2005 届本科毕业论文 第 6 页 共 23 页 电话、双向寻呼机、pda、家用电器、销售网络终端以及汽车导航系统等提供一 种标准化的、轻便的、功能齐全的 java 2 虚拟机构建块。 2.1.2 什么是 profile 所谓profile指基于java技术的api集合,作为configuration的补充,它为某种设 备领域提供特殊的服务,如蜂窝电话或个人数字助理。一个profile定义了受支持 设备的类型。profile被构建在configuration的顶部。由于profile是特定于运行应用 程序的,所以,某个profile是与某种特定的configuration相关联的。 常见的profile 有midp。 midp 适合诸如蜂窝电话和寻呼机等移动设备。midp 是建立在 cldc 之上 的,并且提供一个标准的运行时环境,允许在终端用户设备上动态地部署新的应 用程序和服务。midp 是一个公共的、为移动设备设计的工业标准 profile,它不 依赖某个特定的商家。对于移动应用程序开发来说,它是一个完整的、受支持的 基础 profile。midp 主要定义了: (1) 显示工具包, 用户输入方法 (2) 采用简单的面向记录数据库模型保证一致性数据存储 (3) 采用cldc 通用连接框架提供基于http的网络连接 2.1.3 j2me 平台结构 图 1.1 描述了 j2me 的平台结构(其中的移动信息设备 profile 又称为 midp) java 的整体架构主要由两部份组成,即虚拟机和应用程序接口 api。位于 java 虚 拟机之上的 java api 包含了基本 api 与扩展 api,而 kvm 则为这些 api 提供运 行时环境。 中北大学 2005 届本科毕业论文 第 7 页 共 23 页 图图 1.11.1 j2mej2me 平台结构图平台结构图 j2me 被设计得更加模块化和可缩放化。j2me 通过在原有设备操作系统上建 造 3 层结构,来实现模块化和可缩放化: (1) kvm:kvm 是一种紧凑的、可移植的 java 虚拟机,被设计为专门用在小 型的,内存受限系统上。kvm 基于宿主操作系统,一般按照某种 j2me 的 configuration 要求实现对应的 kvm (2) configuration 层:这一层对于用户可见度要低一些,但对框架层非常重要。 它定义了 java 虚拟机的最小功能集和 java 类库的最小集合 (3) profile 层:这一层对于用户和应用程序提供者来说是最常见的。它定义 了 java 虚拟机的最小功能集和 java 类库的最小集合。profile 是基于特 定的 configuration 层实现的。针对特定 profile 层开发的应用程序可以 移植到其他支持相同 profile 的设备上,一个设备可以支持多种 profile .4 midlet 运行流程 midlet 是一种小型应用程序4,主要运行在嵌入式 java 虚拟机上,它有点象 应用程序,但它又不同与应用程序的运行流程;从 上可以获得 关于 midlet 的更多内容。 下图演示了 midlet 的运行流程: 中北大学 2005 届本科毕业论文 第 8 页 共 23 页 图图 1.21.2 midletmidlet 运行流程运行流程 首先,java 文件被编译为 class 文件,接着经过预验证阶段得到验证后的 class 文件,然后通过 ota 或其他方式下载到目标设备上进行运行。与传统 java 程序 不同的是 kvm 加载程序的时候只做了简单的验证工作,好多工作都交给了 preverifier,这是因为嵌入式系统并不像 pc 那样拥有丰富的资源。 2.22.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 及应用组 成,它有好多优良特点,我们只关心与我们的移植相关的特点,归纳如下: (1) 采用 mlinux 作为操作系统,故我们可以使用绝大部分标准 c 函数,以及 posix 标准函数 (2) 采用 mgui 作为图形化界面,而 mgui api 很像 windows api6,故我们 可以复用一部分 kvm gui api 接口 2.3 包移植示例 下面以 cldc 的 javax.microedition.io 包的移植作为起点,以介绍一些基本知 识 中北大学 2005 届本科毕业论文 第 9 页 共 23 页 2.3.1 javax.microedition.io 包概览 javax.microedition.io 包其实实现了一个通用连接框架(generic connection framework 简称 gcf),是 j2me 对外界沟通的基础,网络通讯、消息服务、蓝牙、 文件系统、端口、sim 卡的存取、都是以 gcf 为基础发展起来的、gcf 结构如图 2.1 所示: 图图. . 结构体系的三个部分及其之间的关系结构体系的三个部分及其之间的关系 也就是说,用户先向连接工厂传送一个 url 地址,连接工厂会根据 url 的 内容,产生一个特殊的连接接口,出于通用的目的,此特殊连接接口会先转型为 通用连接接口;用户则根据自己请求的类型自己将此通用接口转化为特殊接口。 2.3.2 socketconnection 的实现 下面我们将会以图.为向导,一步一步追到底层实现用户要想获得特殊连 接接口一般通过类似下面的代码来实现 特殊连接接口 conn=(特殊连接接口)connector(“url”); 其中的特殊连接接口视连接的类型而定,常见的有:http socket https file sms 等。 为了简化讨论我们假定连接的类型为 socket,url 为 :555。则上述的伪 代码的具体形式就变为: socketconnection conn=( socketconnection)connector.open(“socket:/:555”); 下面我们来看看这行代码是如何做到获得连接的 connector 代码示意如下: 中北大学 2005 届本科毕业论文 第 10 页 共 23 页 01 public class connector 02 03 public static connection open(string spec) 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 = findconnectionclass(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 connectionnotfoundexception(“permission denied“); 18 19spec = 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“); 25if (packagelist != null) 26int last = 0, index = packagelist.indexof(|), end = packagelist.length(); 27while (last mutable) getbitmapdctmp = selectobject(hdcmem, bmp-bitmap); return hdcmem; 函数 releasebitmapdc( )与 getbitmapdc( )相对,它释放 hdc,其实现如下: void releasebitmapdc(hdc hdcmem) handle *mutex = (handle*) tlsgetvalue(tlsid); selectobject(hdcmem, getbitmapdctmp); getbitmapdctmp = null; deletedc(hdcmem); releasemutex(*mutex); 3.33.3 midp api 的实现的实现 3.3.1 分类及示例 虽然从上层看,midp 有好多 api 接口,但大部分都归结到调用几十个 native 函数。这些函数大致可以分为 gui 函数,image 函数,text 函数 三类。下面分别 举例 gui 函数移植示例drawline: graphic 类中的 native 方法 public native void drawline(int x1, int y1, int x2, int y2)实现如下: 01 kniexport kni_returntype_void 02 java_javax_microedition_lcdui_graphics_drawline() 03 int y2 = kni_getparameterasint(4); 04 int x2 = kni_getparameterasint(3); 05 int y1 = kni_getparameterasint(2); 06 int x1 = kni_getparameterasint(1); 07 jshort myclip4; /* defined in graphics.java as 4 shorts */ 08 kni_starthandles(4); 09 kni_declarehandle(thisclass); 中北大学 2005 届本科毕业论文 第 17 页 共 23 页 10 kni_declarehandle(ghandle); 11 kni_declarehandle(chandle); 12 kni_declarehandle(ihandle); 13 kni_getparameterasobject(0, thisclass); 14 kni_getobjectclass(thisclass, ghandle); 15 kni_translate(thisclass, x1, y1, ghandle); 16 kni_translate(thisclass, x2, y2, ghandle); 17 lcduidrawline(kni_pixel(thisclass, ghandle), kni_clip(thisclass, ghandle, myclip, chandle), 18 kni_imagedst(thisclass, ghandle, ihandle, null), kni_linestyle(thisclass, ghandle), 19 x1, y1, x2, y2); 20kni_endhandles(); 21kni_returnvoid(); 22 23void lcduidrawline(int pixel, short *clip, void *dst, int dotted, 24nt x1, int y1, int x2, int y2) 25point pts3; 26graphics_setup(false); 27if (x1 = x2) 29pts0.y = y1; 30pts1.x = x1 + 1; 31pts1.y = y1 + 1; 32polyline(hdc, pts, 2); /* paint single pixel at x1, y1 */ 33 else 34pts0.x = pts2.x = x1; 35pts0.y = pts2.y = y1; 36pts1.x = x2; 37pts1.y = y2; 38polyline(hdc, pts, 3); /* draw line, including both endpts */ 39 40if (!doublebuffer 42 43graphics_cleanup(); 44 分析: 03-16 行:主要负责取出参数。 17 行:调用 lcduidrawline 函数,23-44 的 lcduidrawline 函数实现的功能就是 从点(x1,y1)到(x2,y2)画一条直线(当然还包括颜色,剪切域,实虚线 设定) 18-22 行:结束函数,设置相公返回值 27-33 行:如果要画的线只是一个点,则应多画一个相素(要不然,看不见) 34-39 行:否则,调用画线方法来回画两条紧挨着的线(之所以画两次,也是出于 中北大学 2005 届本科毕业论文 第 18 页 共 23 页 清晰度考虑) 40-44 行:判定目标设备是否是双缓冲的,如果是则应考虑刷新窗口 写过 win32 程序的人一定感觉到上面代码中的 point、polyline、hdc 等很面熟, 这是因为 mfone 中的 mgui api 与 win32 api 很像(不仅外形像,功能也像)的 缘故10。 image 函数移植示例getpixel: graphic 类中的 native 方法 private native int getpixel(int rgb, int gray, boolean isgray)实现如下: 01 kniexport kni_returntype_int 02 java_javax_microedition_lcdui_graphics_getpixel() 03 int isgray = kni_getparameterasboolean(3); 04 int gray = kni_getparameterasint(2); 05 int rgb = kni_getparameterasint(1); 06 kni_returnint(lcduigetpixel(rgb, gray, isgray); 07 08 09 int lcduigetpixel(int rgb, int gray, int isgray) 10 if (numcolors = 2) 11 return (gray 127) ? graytable43 : graytable40; 12 else if (numcolors = 4) 13 return graytable4gray 6; 14 else if (numcolors = 16) 15 return graytable16gray 4; 16 else if (numcolors = 256) 17 int red = (rgb 16) 18 int grn = (rgb 8) 19 int blu = (rgb 0) 20 red = rgtablered 5; 21 grn = rgtablegrn 5; 22 blu = btableblu 6; 23 return rgb(red, grn, blu); 24 else 25 fprintf(stderr, “unsupported color formatn“); 26 return 0; 27 28 分析: getpixel 主要功能是将 java 定义的颜色表示转化为对应平台的颜色表示,上述代 码中的 numcolors 指目标平台支持的颜色位数。 03-05 行:取出参数 06 行:调用 lcduigetpixel(rgb, gray, isgray)并返回相应的值 10-27 行:将 java 定义的颜色空间转化为对应平台的颜色空间 中北大学 2005 届本科毕业论文 第 19 页 共 23 页 text 函数移植示例 charwidth: font 类中的 native 方法 public native int charwidth(char ch)实现如下: kniexport kni_returntype_int java_javax_microedition_lcdui_font_charwidth() unicode c = (unicode)kni_getparameteraschar(1); int fontparams; kni_starthandles(2); kni_declarehandle(thisclass); kni_declarehandle(handle); kni_getparameterasobject(0, thisclass); kni_getobjectclass(thisclass, handle); declare_kni_font_params(thisclass, handle); kni_endhandles(); kni_returnint(lcduicharswidth(fontparams, int lcduicharswidth(fontparams_proto, const unicode *chararray, int n) hdc hdc; size size_ret; hdc = getbitmapdc(null); setupfont(hdc, fontparams); if (!gettextext

温馨提示

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

评论

0/150

提交评论