Java实现方法
Java有两种实现方法:Java方法和本地方法。Java方法是由Java语言编写,编译成字节码,存储在class文件中。本地方法是由其他语言(比如C,C++,或者汇编语言)编写的,编译成和处理器相关的机器代码,保存在动态连接库中,格式是各个平台专有的,它是联系Java程序和底层主机操作系统的连接方法。Java方法与平台无关,但是本地方法却不是,运行中的Java程序调用本地方法时,虚拟机装载包含这个本地方法的动态库,并调用这个方法。通过本地方法,Java程序可以直接访问底层操作系统的资源,使程序和特定的平台相关,一个本地方法接口——Java本地接口(JNI)使得本地方法可以在特定的主机系统的任何一个Java平台上运行。
J2ME中的CDC移植的解决方案
我们选用的要移植的Java虚拟机是Sun公司提供的J2ME对于数字电视领域CDC配置,该虚拟机是针对Linux的软件实现(用C语言编写的虚拟机,该虚拟机也称为CVirtualMachine,简称CVM)。Java虚拟机规范并没有强求Java虚拟机必须支持任何特定的本地方法接口,但是Sun公司提供了本地方法接口(JavaNativeInterface),是为移植所用。Java程序通过调用本地方法和主机交互。
Java虚拟机
图2 Java虚拟机的位置
虚拟机处于嵌入式操作系统OS20上,因此Sun公司提供的Java虚拟机中与底层操作系统相关的操作都应该替换为OS20的内核函数。因此将Sun公司提供的CDC移植到OS20需要完成一些工作,比如:C语言中关于基本数据类型的数据位的修改,关于线程的创建机制(OS20为任务),关于线程之间的同步、互斥,关于动态连接的实现,关于本地方法的实现等,本节主要介绍关于本地方法的实现过程。
本地方法
解释器处理字节码时,与给定字节码有关的动作的语义、执行字节码的相关动作大多是从堆栈中获得其操作数,并将其结果送回堆栈中。典型的情况下字节码是带有参数的,这些参数在字节码流中紧跟在字节码自身之后。
在虚拟机解释字节码过程中,执行引擎会不时遇到请求本地方法调用的指令,虚拟机负责试着发起这个本地方法的调用。本地方法是Java虚拟机指令集的一种可编程扩展,运行这个本地方法就是Java虚拟机对这条指令的执行。
本地方法函数调用
为了增加虚拟机的性能,加快其速度,解释器在处理一些字节码时调用的本地方法函数用汇编实现了将Java栈转换为C栈,然后在C堆栈上实现函数的调用。Linux下是用独立的汇编语言程序invokeNative_i386。S实现函数CVMjniInvokeNative(),我们采用在C里面嵌入汇编的形式来实现该函数。
该函数的形参有7个,完成的主要功能是将由实参传递来的部分数据通过直接或者运算后得到本地方法的参数,然后压入本地栈,通过汇编来实现本地的C函数调用。实参传递过来的7个数据包含JNI环境指针(env)、本地方法的函数指针(nativecode)、Java栈指针(args)、本地方法的描述符(tersesig),Java栈的参数总数(argssize)表示静态或非静态方法的类对象标志(classobject)及用于存储返回值的一个指针变量(returnvalue),其中env要作为第一个本地方法的参数传递,并且nativecode也要传递到本地方法来实现本地方法的正确调用。
价格面议
[查看详情]
关于我们 | 联系我们 | 友情链接 | 诚聘英才 | 意见反馈 | 版权声明 | 网站地图 | 广告服务 | 欢迎投稿 | 免费注册
版权所有 数字视听网 Copyright © 2006-2019. All Rights Reserved 京ICP备06048189号-2 北京市公安局朝阳分局网监中心备案编号:1101051445
QQ群服务:厂商群(146100746) 经销商群(160287492) 投影机群(154576638) 专业音响群(160287677)
服务热线:010-62536866/82627795 传真:010-82627795