java

位置:IT落伍者 >> java >> 浏览文章

Java进阶:Java通过JNI与Delphi交互


发布日期:2020年06月15日
 
Java进阶:Java通过JNI与Delphi交互

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

用delphi开发JNI首先从http://delphijediorg下载JNIpas把它加入到工程中就可以开发JNI了

例如创建桌面快捷方式:

Delphi中的代码:

library myDll

uses

JNIwindowsComObjActiveXShlObjSysUtilsRegistry;

//取得桌面目录

function getDesktopPath():String;

var

Reg:TRegistry;

DesktopPath:String;

begin

Reg:=TRegistryCreate;

try

RegRootKey:=HKEY_CURRENT_USER;

RegOpenKey(Software\Microsoft\Windows\CurrentVersion\Explorer\Shell FoldersFalse);

if RegValueExists(Desktop) then DesktopPath:=RegReadString(Desktop);

Result:= DesktopPath;

finally

RegFree;

end;

end;

//创建桌面快捷方式

procedure CreateDesktopLink(ProgramPath ProgramArg LinkName DescrIconPath: String);

var

AnObj: IUnknown;

ShellLink: IShellLink;

AFile: IPersistFile;

FileName: WideString;

LinkPath:String;

begin

LinkPath:=getDesktopPath()+\+linkName;

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

begin

raise ExceptionCreate(快捷方式的扩展名必须是lnk!);

end;

try

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

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

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

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

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

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

ShellLinkSetArguments(PChar(ProgramArg));// 目标文件参数

ShellLinkSetWorkingDirectory(PChar(ExtractFilePath(ProgramPath)));//目标文件的工作目录

ShellLinkSetDescription(PChar(Descr));// 对目标文件的描述

ShellLinkSetIconLocation(PChar(IconPath));

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

AFileSave(PWChar(FileName) False);//保存快捷方式

finally

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

end;

end;

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

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

procedure Java_com_wpd_JavaWindows_createDesktopLink(PEnv: PJNIEnv; Obj: JObject;ProgramPathProgramArgLinkNameDescriconPath:JString);stdcall;

var

JVM:TJNIEnv;

PPath:String;

PArg:String;

LName:String;

Description:String;

IPath:String;

begin

JVM := TJNIEnvCreate(PEnv);

PPath:=JVMUnicodeJStringToString(ProgramPath);

PArg:=JVMUnicodeJStringToString(ProgramArg);

LName:=JVMUnicodeJStringToString(LinkName);

Description:=JVMUnicodeJStringToString(Descr);

IPath:=JVMUnicodeJStringToString(IconPath);

CreateDesktopLink(PPathPArgLNameDescriptionIPath);

JVMFree;

end;

//向java发送一个信息

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

var

JVM:TJNIEnv;

msg:JObject;

m:String;

begin

JVM := TJNIEnvCreate(PEnv);

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

m:=UTFEncode(中国人);

msg:=JVMStringToJString(PChar(m));

result:= msg;

end;

{$R *res}

exports

Java_com_wpd_JavaWindows_createDesktopLink

Java_com_wpd_JavaWindows_sendMessage;

end

把上面的编译生成myDlldll文件放到java能够找到的地方

java中的代码:

package comwpd;

public class JavaWindows {

public native void createDesktopLink(String programPathString programArgString linkPathString descriptionString iconPath);

public native String sendMessage();

static{

SystemloadLibrary(myDll);

}

public static void main(String s[]){

new JavaWindows()createDesktopLink(c:\textexe测试LNKc:\testico);

Systemoutprintln(new JavaWindows()sendMessage());

}

}

               

上一篇:Java进阶:讨论关于Java占用内存的研究[1]

下一篇:Java进阶:一个简单Thread缓沖池的实现[1]