终于在网上找到一篇delphi调用Java的文章<br>今天测试完毕,Jdbc的调用看来只能使用Java然后封装起来,返回给Delphi<br>效率等问题还有待测试<br><br>Java JNI 和 Delphi 相互調用<br><br>DELPHI 調用 JAVA 的方法,作為入門也不算複雜,只是創建JVM的環境麻煩一些。進行的順序是:<br><br>a.建立 JVM 環境<br>b.創建 JAVA 環境實例<br>c.找到 class<br>d.找到方法<br>e.調用方法<br>f.結束<br><br>如何得到 DELPHI 的 JNI 定義,請看前一篇中的說明。直接進入主題。<br><br>二、介紹 DELPHI 調用 JAVA 的方法<br>1、創建一個 DelphiCallJava.java,文件的內容:<br>public class DelphiCallJava ...{<br><br> public static String dTest(String args)...{<br> if(args==null)...{<br> return "您沒有輸入參數.";<br> }else ...{<br> return "您輸入的參數是:"+args;<br> }<br> }<br>}<br><br>這個類太簡單了,沒什麼可說的。將這個 class 保存成無 BOM 的 UTF-8 格式文件。同樣,從簡單起見,也是沒有創建包的。再用下面這個命令行進行編譯:<br>javac -encoding utf-8 DelphiCallJava.java<br><br><br>2、創建 Delphi 的EXE工程<br>JAVA 的數據類型轉換到 DELPHI 的數據類型,請看 jni.pas 中的定義。<br><br>DelphiCallJava.dpr 的代碼:<br><br><br>program DelphiCallJava;<br>...{$APPTYPE CONSOLE}<br><br>uses Windows, SysUtils, Variants, Classes, jni;<br><br>const Handle=0;<br>const strParam='傳給java的參數';<br><br>label lexit;<br>var jvm: Jni.PJavaVM;<br> tenv: Jni.TJNIEnv;<br><br> cid: Jni.JClass;<br> mid: Jni.JMethodID;<br> tmp: Jni.JString;<br> <br> vm_args: Jni.JavaVMInitArgs; //建立 JVM 的參數<br> options: array[0..2] of Jni.JavaVMOption;<br> env: Jni.PJNIEnv;<br> rec: Integer;<br>begin<br> options[0].optionString := '-Djava.compiler=NONE';<br> options[1].optionString := '-Djava.class.path=.'; // Java 工程路徑, '.' 表示黨前路徑<br> options[2].optionString := '-verbose:jni';<br><br> JNI_GetDefaultJavaVMInitArgs(@vm_args);<br> vm_args.version := Jni.JNI_VERSION_1_4;<br> vm_args.options := @options;<br> vm_args.nOptions := 3;<br> vm_args.ignoreUnrecognized := Jni.JNI_TRUE;<br><br> rec := Jni.JNI_CreateJavaVM(@jvm, @env, @vm_args); //建立JVM<br> if (rec = JNI_ERR ) then begin<br> Windows.MessageBox(Handle, 'create JVM exception.', ’DelphiCallJava‘, Windows.MB_OK);<br> exit;<br> end;<br> <br> tenv := TJNIEnv.Create(env);<br> if tenv=nil then Begin<br> Windows.MessageBox(Handle, 'Please load jvm first.', ’DelphiCallJava‘, Windows.MB_OK);<br> Exit;<br> End;<br><br><br><br> //取得 DelphiCallJava 的類ID, 如果有'包',也指定, <package>.<class><br> cid := tenv.FindClass('DelphiCallJava');<br> if (cid = nil) then begin<br> Windows.MessageBox(Handle, '找不到類
elphiCallJava', ’DelphiCallJava‘, Windows.MB_OK);<br> goto lexit;<br> end;<br><br> //取得方法ID<br> mid := tenv.GetStaticMethodID(cid, 'dTest', '(Ljava/lang/String
Ljava/lang/String;'); <br> if (tenv.ExceptionOccurred()<>nil) then begin<br> Windows.MessageBox(Handle, '找不到方法(dTest)', ’DelphiCallJava‘, Windows.MB_OK);<br> goto lexit;<br> end;<br><br> //將 string 轉換成 java string<br> tmp := tenv.StringToJString(PChar(UTF8Encode(strParam)));<br> //用類ID和方法ID調用 JAVA 方法<br> tmp := tenv.CallStaticObjectMethod(cid, mid, [tmp]); <br> if (tenv.ExceptionOccurred()<>nil) then begin<br> Windows.MessageBox(Handle, '調用方法(dTest)失敗!', ’DelphiCallJava‘, Windows.MB_OK);<br> goto lexit;<br> end;<br><br> //顯示結果<br> writeLn( ''  
;<br> writeLn( '傳給java的參數是:' +strParam );<br> writeLn( 'java返回:'+UTF8Decode(tenv.JStringToString(tmp))  
;<br><br> lexit:<br> <br> if tenv<>nil then begin<br> freeAndNil(tenv);<br> jvm^.DestroyJavaVM(jvm); //釋放JVM資源<br> End;<br>end.<br><br>準備命令行編譯,別忘記 jni.pas 和 jni_md.inc 放在一塊,編譯命令:<br>dcc32 /B DelphiCallJava.dpr<br><br><br>3、執行、測試<br>將這幾個命令行的編譯做成一個批處理文件:<br><br><br>@ECHO OFF<br>rem 語言編碼名稱, 要和操作系統相對應,否則會出現亂碼.<br><br>rem jre所在的路徑,像 JAVA_HOME 一樣指向安裝的目錄<br>SET JRE_HOME=C:sdk/jdk1.5.0_15/jre<br><br>SET PATH=%PATH%;C:/Program Files/borland/Delphi7/Bin<br>REM jvm.dll 一定要在 PATH 所指的路徑下, 因為 Delphi 要調用 jvm.dll<br>SET PATH=%PATH%;%JRE_HOME%/bin/client<br><br><br>rem java 的編譯命令行<br>javac -encoding big5 DelphiCallJava.java<br><br>REM 編譯delphi的工程<br>dcc32 /B DelphiCallJava.dpr<br><br>rem 執行demo<br>IF EXIST DelphiCallJava.exe call DelphiCallJava.exe<br><br>PAUSE<br><br><br>保存成 DelphiCallJava.cmd ,雙擊執行,即看到結果,如圖:<br>圖1<br>可以看到,圖中前面輸出的是JVM的DEBUG信息。不輸出DEBUG 信息,就清楚多了,看下圖:<br>http://read.newbooks.com.cn/info/196658.html