Java Native Interface(Java 调用Delphi、C、C++编写的DLL)

    前些日子,就在两天前,由于公司业务上的需求,需要用Java调用另外一Delphi公司编写的代码,然后再用WebService做相对应的数据交互。当时,彼公司提供了一套测试代码,当然是delphi的代码和一套DLL, 另附DOC接口文档一套。由于公司内部没有Delphi的编程经验,只能写相关的java代码来调用彼公司提供的DLL。

    而Java调用DLL有两种方法, 一种就是JNI,Java Native Interface,另外一种就是JNA,Java Native Access。这两种调用方法前一个是JAVA内置支持的,但对DLL的编写有一定的约束,也就是说如果你先写java代码,然后用相关的约束再编写DLL是可行的。另一种情况就是我公司碰到的情况,两个毫无业务来往的公司写的程序,突然之间需要产生调用关系,也就是说DLL的编写是没有任何约束的,这样使用JNI就显得相当困难,除非两个公司能够很好的合作,否则调用将异常困难。当然解决方法就是采用JNA,但JAVA本身并不支持JNA,需要第三方类库的支持,也就是JNA.JAR,这个类库可以在java.net上找到该开源工程的主页,里面有对应的文档和示例代码。

    但不管是JNI还是JNA,其与DLL交互的原理都是通过计算机系统的底层来实现的。拿windows来说,java与dll的交互是通过windows的com组件来交互的,也就是说com是中间的接口。那么java调用DLL的最基本的约束就出来了:

    java调用DLL时,如果涉及到参数传递时,那么参数的类型必须在com中有相关的对应关系,否则不可能产生调用关系(Type Mapping可以参考http://www.dynamsoft.com/help/TWAIN/Guide_DataMapping.htm)。

    拿DLL中的结构体来说,C、C++中都是用struct来声明,Delphi中是用record来声明,如果你调用一个带有结构体的参数的方法,那么在DLL的源码中,如果你直接将结构体做为参数传入涵数里面,那么这个结构体在COM中是没有对应的数据类型的,调用将不可能成功。你所需要做的是将这个结构体的引用或指针做为参数传入,这时这个参数也就是一个地址,一个十六进制对应的数字,这样一来调用就不会存在问题。

例如,拿Delphi的代码来说:

 

 

这时copyw这个函数将不可能被JAVA调用,你需要将每一个参数的数据类型改为指针PTman或者引用@Tman,这样才能产生正确的调用。

 

以上就是这次技术碰撞我所体会到的,写出来供大家分享一下,请多多指教。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值