<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    聚合 管理  

    Blog Stats

    News

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

    隨筆分類(28)

    文章分類(4)

    隨筆檔案(53)

    文章檔案(4)

    相冊

    相關鏈接


    林俊海的博客

    超級大菜鳥,每天要自強!

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

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


    首先,我們先定義如下的 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 函數, 返回值類型為 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);

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

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

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

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

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

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

    例如: 我們要給 Delphi 的方法傳入一個 byte[] 型數組,在定義 Delphi 方法時參數聲明為 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);? //調用這個方法,可以將取得參數 bytearray 的地址, isCopy 決定是否復制數組
    ?//之后,我們可以通過 PByteArr 結合 inc(PByteArr) 這個指針來操作傳過來的數組.
    end;


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

    posted on 2006-12-11 23:13 林俊海 閱讀(834) 評論(0)  編輯  收藏 所屬分類: JAVA天地
    主站蜘蛛池模板: 亚洲无砖砖区免费| ww在线观视频免费观看w| 成人永久免费福利视频网站| 久青草国产免费观看| 久久精品亚洲精品国产色婷| 日韩精品免费一区二区三区| 久久99免费视频| 自拍偷区亚洲国内自拍| 亚洲精品国产va在线观看蜜芽| 国产99视频精品免费专区| 亚洲AV一区二区三区四区| 亚洲高清专区日韩精品| 成年女人免费视频播放体验区 | 亚洲va精品中文字幕| 亚洲国产婷婷综合在线精品| 精品熟女少妇av免费久久| 黄网站在线播放视频免费观看| 亚洲成人动漫在线| 亚洲av无码国产精品色在线看不卡| 嫩草成人永久免费观看| 亚洲精品乱码久久久久蜜桃| 亚洲AV综合色一区二区三区| 国产乱人免费视频| 18禁免费无码无遮挡不卡网站| 久草视频在线免费| 成人一区二区免费视频| 亚洲高清视频一视频二视频三| 免费A级毛片无码视频| 一级毛片在播放免费| 亚洲日本VA中文字幕久久道具| 亚洲国产精品lv| 久久亚洲国产精品五月天婷| 免费观看男人免费桶女人视频| 91制片厂制作传媒免费版樱花| 成人免费无码H在线观看不卡| 在线精品自拍亚洲第一区| 亚洲中文字幕人成乱码| 亚洲日本va午夜中文字幕一区| 伊人久久大香线蕉亚洲| 亚洲精品乱码久久久久久不卡| 暖暖在线日本免费中文|