`

利用java jndi调用 delphi写的dll

阅读更多
项目背景: 由于系统由CS+BS架构,在CS架构的基础上增加BS发布浏览检索部分等功能,需要公用一些表,但有些数据表是经过delphi特殊算法加密的,在java中很难找到对应的算法解密。
解决方法:
1)可以利用delphi写webservice供java调用
2)delphi写httpserver提供解析服务
3)利用jndi使delphi输出java可调用的dll

方法1)开发方便,部署麻烦
方法2)通用性高,开发量大
方法3)在小规模的集成上比较方便,缺点是难调试

根据项目实际情况选择了方法3作为解决办法

下面是一个简单的调用例子

第一部分,利用delphi编写dll

library HelloWorldImpl;

uses
  JNI;

procedure Java_HelloWorld_displayHelloWorld(PEnv: PJNIEnv; Obj: JObject); {$IFDEF WIN32} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
begin
  Writeln('Hello world!');
end;

exports
  Java_HelloWorld_DisplayHelloWorld;

end.


JNI 单元是Java Native Interface with Delphi
提供了Java与Delphi 函数,类等调用转换的接口,并包含了转换Delphi变量到JVM变量等功能

输出的dll文件,如果是普通javaproject可以拷贝到jdk下的bin目录中,如果是tomcat web服务,则可以拷贝到tomcat-home/bin目录下,也可拷贝到jdk下的bin目录,webservice也类似

第二部分 java代码

class HelloWorld
{
  public native void displayHelloWorld();
  static
  {
    System.loadLibrary("HelloWorldImpl");
  }
}


第三部分 调用代码示例

class Main
{
  public static void main(String[] args)
  {
    HelloWorld hw = new HelloWorld();
    hw.displayHelloWorld();
  }
}


需要注意事项:

delphi书写函数名的规范示例

function Java_com_common_utils_UnCompressString_unCompress(PEnv: PJNIEnv; Obj: JObject;value:JString):JString; 

函数名必须以Java开头,剩下的部分是Java类的包路径+下滑线 + 类名 + 下滑线 + 方法名

上面的函数对应的java包 com.common.utils 类 UnCompressString 方法 unCompress

函数必须传入至少两个参数 (PEnv: PJNIEnv; Obj: JObject;)

函数参数的数据类型不能用delphi语言自带的,而是用JNI单元里对应的函数


更多Java Native Interface with Delph的使用方法参考地址:http://www.pacifier.com/~mmead/jni/delphi/index.html













分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics