项目背景: 由于系统由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
分享到:
相关推荐
三种方式实现java远程调用(rmi) 方式一:原始方式 方式二:spring 方式三:jndi 解压,放到myeclipse上可用
NULL 博文链接:https://gukeming888.iteye.com/blog/1714402
javaJNDI连接数据库
NULL 博文链接:https://javaeedevelop.iteye.com/blog/1326583
JavaJNDI 数据链接池及 属性文件读取数据链接信息
JNDI java操作示例,JNDI java操作示例
java 采用JNDI访问数据库(三种方法)
实现JAVA调用CS类库DLL的 JNDI代码样例
这是我平时自己总结的有关做开发时候遇到的JNDI配置相关的问题,不算多,拿出来分享一下
基于Java JNDI 操纵LDAP的基础实现,包括LDAP连接相关生命周期,认证的两种策略demo,条目的操作,schema的基础操作包括(attributeDefinition\objectDefinition\)但未包含相关syntaxDefinition的操纵. 没有资源分的朋友...
JAVA JNDI免证书修改AD域密码
JNDI服务利用工具 RMI/LDAP,支持部分场景回显、内存shell,高版本JDK场景下利用等,fastjson rce命令执行,log4j rce命令执行 漏洞检测辅助工具
DataSource source = (DataSource) ic.lookup("java:comp/env/jdbc/jndidemo"); dbcon = source.getConnection(); 需要导的包 import javax.naming.Context; import javax.naming.InitialContext; import ...
JNDI(Java Naming and Directory Interface)是SUN公司提供的一种标准的Java命名系统接口,JNDI提供统一的客户端API,通过不同的访问提供者接口JNDI SPI的实现,由管理者将JNDI API映射为特定的命名服务和目录系统,...
技术专栏 _ 深入理解JNDI注入与Java反序列化漏洞利用 企业安全 工控安全 安全对抗 安全建设 企业安全
JNDI 开发配置,有问题联系我,我觉得JNDI学习的人不是很多
JNDI是Java Naming and Directory Interface(JAVA命名和目录接口)的英文简写,它是为JAVA应用程序提供命名和目录访问服务的API(Application Programing Interface,应用程序编程接口)。
JNDI配置原理详解 JNDI配置原理详解.doc
Java演示JNDI的使用,在EJB中使用JNDI的例子,首先初始化Context,它是连接JNDI树的起始点,查找对象、打印对象、关闭Context。
NULL 博文链接:https://dolphin-ygj.iteye.com/blog/436936