编程应用实例:Java通过JNI与Delphi交互

前一段时间,我用java开发一个安装程序,适用于tomcat mysql构建的web环境。在开发的过程中遇到与写注册表,注册系统服务等问题用java本身很难解决,于是我想到用JNI。C与delphi两者开发JNI,我是从delphi转到java上来的,我选择了delphi。

用delphi开发JNI,首先从http://delphi-jedi.org下载JNI.pas,把它加入到工程中就可以开发JNI了。

例如创建桌面快捷方式:

Delphi中的代码:

library myDll

uses

JNI,windows,ComObj,ActiveX,ShlObj,SysUtils,Registry;

//取得桌面目录

function getDesktopPath():String;

var

Reg:TRegistry;

DesktopPath:String;

begin

Reg:=TRegistry.Create;

try

Reg.RootKey:=HKEY_CURRENT_USER;

Reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders',False);

if Reg.ValueExists('Desktop') then DesktopPath:=Reg.ReadString('Desktop');

Result:= DesktopPath;

finally

Reg.Free;

end;

end;

//创建桌面快捷方式

procedure CreateDesktopLink(ProgramPath, ProgramArg, LinkName, Descr,IconPath: String);

var

AnObj: IUnknown;

ShellLink: IShellLink;

AFile: IPersistFile;

FileName: WideString;

LinkPath:String;

begin

LinkPath:=getDesktopPath()+'\'+linkName;

if UpperCase(ExtractFileExt(LinkPath))<>'.LNK' then //检查扩展名是否正确

begin

raise Exception.Create('快捷方式的扩展名必须是.lnk!');

end;

try

OleInitialize(nil);//初始化OLE库,在使用OLE函数前必须调用初始化

AnObj := CreateComObject(CLSID_ShellLink);//根据给定的ClassID生成一个COM对象,此处是快捷方式

ShellLink := AnObj as IShellLink;//强制转换为快捷方式接口

AFile := AnObj as IPersistFile;//强制转换为文件接口

//设置快捷方式属性,此处只设置了几个常用的属性

ShellLink.SetPath(PChar(ProgramPath)); // 快捷方式的目标文件,一般为可执行文件

ShellLink.SetArguments(PChar(ProgramArg));// 目标文件参数

ShellLink.SetWorkingDirectory(PChar(ExtractFilePath(ProgramPath)));//目标文件的工作目录

ShellLink.SetDescription(PChar(Descr));// 对目标文件的描述

ShellLink.SetIconLocation(PChar(IconPath),0);

FileName := LinkPath;//把文件名转换为WideString类型

AFile.Save(PWChar(FileName), False);//保存快捷方式

finally

OleUninitialize;//关闭OLE库,此函数必须与OleInitialize成对调用

end;

end;

//创建桌面快捷方式,在JNI中调用的就是这个方法

//这个过程的命名很有讲究,它以 Java 开头,用下划线将 Java 类的包名、类名和方法名连起来。这个命名方法不能有误,否则, Java 类将无法将 nativ 方法与它对应起来。同时,在 Win32 平台上,此过程的调用方式只能声明为 stdcall 。

procedure Java_com_wpd_JavaWindows_createDesktopLink(PEnv: PJNIEnv; Obj: JObject;ProgramPath,ProgramArg,LinkName,Descr,iconPath:JString);stdcall;

var

JVM:TJNIEnv;

PPath:String;

PArg:String;

LName:String;

Description:String;

IPath:String;

begin

JVM := TJNIEnv.Create(PEnv);

PPath:=JVM.UnicodeJStringToString(ProgramPath);

PArg:=JVM.UnicodeJStringToString(ProgramArg);

LName:=JVM.UnicodeJStringToString(LinkName);

Description:=JVM.UnicodeJStringToString(Descr);

IPath:=JVM.UnicodeJStringToString(IconPath);

CreateDesktopLink(PPath,PArg,LName,Description,IPath);

JVM.Free;

end;

//向java发送一个信息

function Java_com_wpd_JavaWindows_sendMessage(PEnv: PJNIEnv; Obj: JObject):JObject;stdcall;

var

JVM:TJNIEnv;

msg:JObject;

m:String;

begin

JVM := TJNIEnv.Create(PEnv);

//*********如果发送的信息中包含中文字符,则要先要经过UTF8Encode转码,否则在java中取得时会是乱码

m:=UTF8Encode('中国人');

msg:=JVM.StringToJString(PChar(m));

result:= msg;

end;

{$R *.res}

exports

Java_com_wpd_JavaWindows_createDesktopLink,

Java_com_wpd_JavaWindows_sendMessage;

end.

把上面的编译生成myDll.dll文件,放到java能够找到的地方。

java中的代码:

package com.wpd;

public class JavaWindows {

public native void createDesktopLink(String programPath,String programArg,String linkPath,String description,String iconPath);

public native String sendMessage();

static{

System.loadLibrary("myDll");

}

public static void main(String s[]){

new JavaWindows().createDesktopLink("c:\text.exe","","测试.LNK","","c:\test.ico");

System.out.println(new JavaWindows().sendMessage());

}

}

· 把年龄相仿的狮虎熊放一起,谁更厉害?结果出人意料

很多人都想知道狮子、老虎和熊打起来谁最厉害,于是便有好事之人把这三种动物关在一起...

· 湖北宜昌三峡坝区水面惊现神秘动物

近日,湖北宜昌,一段视频在当地热传:有网友在三峡坝区拍到神秘动物,体型硕大数米长...

· 什么是语段?语段的类型以及和句群、段落的区别与联系是什么?

句群是最高级的语言单位。 段落(自然段)是章法单位...

 
用Delphi开发JNI(Java Native Interface)应用(二)
要正确地访问类对象的成员属性(字段)及成员方法,最重要的一点是一定要给出正确的签名,在Java中对于数据类型和方法的签名有如下的约定:数据类型/方法签名byteBcharCdoubleDfloatFintIlongJ (注意:是J不是L)shor...查看完整版>>用Delphi开发JNI(Java Native Interface)应用(二)
 
用Delphi开发JNI(Java Native Interface)应用(一)
JNI(Java Native Interface,Java本地接口)技术大家都不陌生,它可以帮助解决Java访问底层硬件的局限和执行效率的提高。关于JNI的开发,大多数资料讨论的都是如何用C/C++语言开发JNI,甚至于JDK也提供了一个javah工具...查看完整版>>用Delphi开发JNI(Java Native Interface)应用(一)
 
JAVA通过JNI调用本地C语言方法
Java以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它和本地机器的各种内部联系变得很少,约束了它的功能。解决JAVA对本地操作的一种方法就是JNI。JAVA通过JNI调用本地方法,而本地方法是以库文件...查看完整版>>JAVA通过JNI调用本地C语言方法
 
JAVA通过JNI调用本地C语言方法
  JAVA以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它和本地机器的各种内部联系变得很少,约束了它的功能。解决JAVA对本地操作的一种方法就是JNI。  JAVA通过JNI调用本地方法,而本地方法是...查看完整版>>JAVA通过JNI调用本地C语言方法
 
Java Applet 编程技巧实例专辑-图像处理
  Java Applet常用来显示存储在GIF文件中的图像。Java Applet装载GIF图像非常简单,在Applet内使用图像文件时需定义Image对象。多数Java Applet使用的是GIF或JPEG格式的图像文件。Applet使用getImage方法把图像文件...查看完整版>>Java Applet 编程技巧实例专辑-图像处理