聚合 管理  

          Blog Stats

          News

          我使用新博客啦:
          http://www.linjunhai.com/
          大家到我的新博客上看看吧!

          隨筆分類(28)

          文章分類(4)

          隨筆檔案(53)

          文章檔案(4)

          相冊

          相關(guān)鏈接


          林俊海的博客

          超級大菜鳥,每天要自強(qiáng)!

          通過 JNI 讓 JAVA 與 Delphi 程序交互(四)

          在上一篇中,我們說了如何用 Java 調(diào)用 Delphi 程序的一個方法并傳遞給其一個參數(shù)
          現(xiàn)在我們再來看一下如果如果要調(diào)用的方法有返回值,又要怎么做.


          首先,我們先定義如下的 Java 類:

          //------------------------------------------------------------------------------
          package alvinJNI;

          class HelloWorld {
          ??????? static {
          ??????????????? System.loadLibrary("DelphiAction");
          ??????? }

          ??????? public native String printText(String arg);

          ??????? public static void main(String[] args) {
          ??????????????? HelloWorld hw = new HelloWorld();
          ??????????????? System.out.println(hw.printText("你好"));
          ??????? }

          }
          //-------------------------------------------------------------------------------

          我們再像上次一樣在 Delphi 中建立 DLL 工程,寫下面的代碼(有注釋):

          //-------------------------------------------------------------------------------
          library DelphiAction;

          uses
          ? JNI;

          //今天,因為這個方法有返回值,所以不再是 procedure 過程,我們要變成 function 函數(shù), 返回值類型為 JString
          function Java_alvinJNI_HelloWorld_printText(PEnv: PJNIEnv; Obj: JObject; arg: JString): JString; stdcall;
          var
          ? tmpStr: String;
          ? JVM: TJNIEnv;
          ? tt: Boolean;
          begin
          ? JVM:= TJNIEnv.Create(PEnv);

          ? //我們這里先把參數(shù)提交過來的 JString 轉(zhuǎn)換成 Delphi 中的 String 后就可以使用了
          ? tmpStr := '你想輸出的字符串是: "' + JVM.UnicodeJStringToString(arg) + '"。';

          ? //當(dāng)字符串要轉(zhuǎn)換成 JString 我們需要先對字符串進(jìn)行 UTF8 編碼后再轉(zhuǎn)換成 PChar 再轉(zhuǎn)換成 JString
          ? //這樣才能保證返回的字符串在 JAVA 中不亂碼
          ? Result := JVM.StringToJString(pchar(UTF8Encode(tmpStr)));
          ? JVM.Free;
          end;

          exports
          ??????? Java_alvinJNI_HelloWorld_printText;
          end.
          //--------------------------------------------------------------------------------

          再看看效果吧,是不是成功了?

          這里如果返回值的類型是其它的其本類型,比如 JLong,JInt,JFloat,JDouble,JBoolean,JShort,JByte
          這些類型的數(shù)據(jù)可以直接與 Delphi 中的數(shù)據(jù)運算,對應(yīng) Int64,Integer,Single,Double,Boolean,SmallInt,ShortInt
          返回時可以直接給 Result 賦 Delphi 中的數(shù)值. 如:
          function Java_alvinJNI_HelloWorld_getInt(PEnv: PJNIEnv; Obj: JObject): JInt; stdcall;
          var
          ? tmp: Integer;
          begin
          ? tmp := 10;
          ? Result := tmp;
          end;

          如果返回值的類型是 Object 的 Java 對象,返回 JObject 類型,它的用法我們在以后再來學(xué)習(xí).
          如果返回值的類型是 Type[] 數(shù)組,接收參數(shù)時要設(shè)為 JObject 類型,怎樣創(chuàng)建這樣的數(shù)組對象,我自己也還不知道,以后知道了我再來貼上
          因為 Java 是把數(shù)組作為對象看待的.它要以以下的方式來使用:

          例如: 我們要給 Delphi 的方法傳入一個 byte[] 型數(shù)組,在定義 Delphi 方法時參數(shù)聲明為 bytearray: JObject

          在方法中:
          var
          ?PByteArr: PJByte?? //PJByte 是 JNI.pas 定義的, 里面還有 PJBoolean, PJObject, PJInt 等..
          ?JVM: TJNIEnv;
          ?isCopy: Boolean;
          begin
          ?JVM:= TJNIEnv.Create(PEnv);
          ?isCopy := false;
          ?PByteArr := JVM.GetByteArrayElements(bytearray, isCopy);? //調(diào)用這個方法,可以將取得參數(shù) bytearray 的地址, isCopy 決定是否復(fù)制數(shù)組
          ?//之后,我們可以通過 PByteArr 結(jié)合 inc(PByteArr) 這個指針來操作傳過來的數(shù)組.
          end;


          好了,就先說到這里,今天,你是不是又學(xué)到了什么?

          posted on 2006-12-11 23:13 林俊海 閱讀(835) 評論(0)  編輯  收藏 所屬分類: JAVA天地
          主站蜘蛛池模板: 汶上县| 修水县| 平陆县| 北川| 林州市| 台北市| 庆元县| 漳平市| 政和县| 阿巴嘎旗| 铜山县| 三江| 株洲市| 阿尔山市| 汾西县| 马尔康县| 嵊州市| 临猗县| 全南县| 阜平县| 平塘县| 固安县| 阳新县| 隆昌县| 历史| 正镶白旗| 余江县| 岗巴县| 武定县| 高台县| 泗洪县| 通城县| 宁津县| 石嘴山市| 永登县| 会泽县| 博爱县| 灵川县| 宜丰县| 明水县| 岫岩|