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

第一夫人華

第一夫人華

2016-02-19 21:03

清醒时做事,糊涂时读书,大怒时睡觉,无聊时关注图老师为大家准备的精彩内容。下面为大家推荐编程应用实例: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('SoftwareMicrosoftWindowsCurrentVersionExplorerShell 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;

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

  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");

  }

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

  public static void main(String s[]){

  new JavaWindows().createDesktopLink("c:ext.exe","","测试.LNK","","c:est.ico");

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

  }

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

  }
  

展开更多 50%)
分享

猜你喜欢

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

编程语言 网络编程
编程应用实例:Java通过JNI与Delphi交互

Delphi 应用编程实例简介

Delphi
Delphi 应用编程实例简介

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

通过SSH交互进行Java应用开发

Web开发
通过SSH交互进行Java应用开发

Delphi编程技巧实例

Delphi
Delphi编程技巧实例

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

JAVA通过JNI调用本地C语言方法

编程语言 网络编程
JAVA通过JNI调用本地C语言方法

Java操作XML编程实例解析

Web开发
Java操作XML编程实例解析

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

Win10如何提高桌面图标刷新速度

Win10如何提高桌面图标刷新速度

如何在Java应用程序中动态的分配CPU资源

如何在Java应用程序中动态的分配CPU资源
下拉加载更多内容 ↓