J/Direct - 编程入门网
作者 佚名技术
来源 NET编程
浏览
发布时间 2012-06-25
J/Direct时间:2007-05-29 yycnet.yeah.net yyc译 J/Direct是调用Win32 DLL函数最简单的方式。它的主要设计目标是与Win32API打交道,但完全可用它调用其他任何API。但是,尽管这一特性非常方便,但它同时也造成了某些限制,且降低了性能(与RNI相比)。但J/Direct也有一些明显的优点。首先,除希望调用的那个DLL里的代码之外,没有必要再编写额外的非Java代码,换言之,我们不需要一个封装器或者代理/存根DLL。其次,函数自变量与标准数据类型之间实现了自动转换。若必须传递用户自定义的数据类型,那么J/Direct可能不按我们的希望工作。第三,就象下例展示的那样,它非常简单和直接。只需少数几行,这个例子便能调用Win32 API函数MessageBox(),它能弹出一个小的模态窗口,并带有一个标题、一条消息、一个可选的图标以及几个按钮。令人震惊的是,这里便是我们利用J/Direct调用Win32 DLL函数所需的全部代码。其中的关键是位于示范代码底部的MessageBox()声明之前的@dll.import引导命令。它表面上看是一条注释,但实际并非如此。它的作用是告诉编译器:引导命令下面的函数是在USER32 DLL里实现的,而且应相应地调用。我们要做的全部事情就是提供与DLL内实现的函数相符的一个原型,并调用函数。但是毋需在Java版本里手工键入需要的每一个Win32 API函数,一个Microsoft Java包会帮我们做这件事情(很快就会详细解释)。为了让这个例子正常工作,函数必须“按名称”由DLL导出。但是,也可以用@dll.import引导命令“按顺序”链接。举个例子来说,我们可指定函数在DLL里的入口位置。稍后还会具体讲述@dll.import引导命令的特性。用非Java代码进行链接的一个重要问题就是函数参数的自动配置。正如大家看到的那样,MessageBox()的Java声明采用了两个字串自变量,但原来的C方案则采用了两个char指针。编译器会帮助我们自动转换标准数据类型,同时遵照本章后一节要讲述的规则。最好,大家或许已注意到了main()声明中的UnsatisfiedLinkError异常。在运行期的时候,一旦链接程序不能从非Java函数里解析出符号,就会触发这一异常(事件)。这可能是由多方面的原因造成的:.dll文件未找到;不是一个有效的DLL;或者J/Direct未获您所使用的虚拟机的支持。为了使DLL能被找到,它必须位于Windows或Windows\System目录下,位于由PATH环境变量列出的一个目录中,或者位于和.class文件相同的目录。J/Direct获得了Microsoft Java编译器1.02.4213版本及更高版本的支持,也获得了Microsoft JVM 4.79.2164及更高版本的支持。为了解自己编译器的版本号,请在命令行下运行JVC,不要加任何参数。为了解JVM的版本号,请找到msjava.dll的图标,并利用右键弹出菜单观察它的属性。public class ShowMsgBox { public static void main(String args[]) throws UnsatisfiedLinkError { MessageBox(0, "Created by the MessageBox() Win32 func", "Thinking in Java", 0); } /** @dll.import("USER32") */ private static native int MessageBox(int hwndOwner, String text, String title, int fuStyle); } |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |
你可能对下面的文章感兴趣
上一篇: 复杂性理论 - 编程入门网下一篇: 多重派遣 - 编程入门网
关于J/Direct - 编程入门网的所有评论