熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Java進階:Java通過JNI與Delphi交互

2013-11-23 19:38:28  來源: Java核心技術 

  前一段時間我用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());
   }
  }


From:http://tw.wingwit.com/Article/program/Java/hx/201311/27225.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.