<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天地
    主站蜘蛛池模板: 国产男女猛烈无遮挡免费视频 | 国产精品黄页在线播放免费| 亚洲视频欧洲视频| 国产好大好硬好爽免费不卡| 亚洲国产成人片在线观看| 成人精品视频99在线观看免费| 亚洲色偷拍另类无码专区| 最近更新免费中文字幕大全 | 亚洲av无码国产综合专区| 91成人免费在线视频| 亚洲H在线播放在线观看H| 97无码免费人妻超级碰碰夜夜| 亚洲国产精品ⅴa在线观看| 国产三级免费电影| 成人国产网站v片免费观看 | 国产精品亚洲精品| 免费视频中文字幕| 免费福利资源站在线视频| 精品国产亚洲男女在线线电影 | 午夜免费不卡毛片完整版| 亚洲AV无码一区二区三区国产| 久久午夜免费视频| 亚洲精品伊人久久久久| 国产美女被遭强高潮免费网站 | 又黄又大的激情视频在线观看免费视频社区在线 | 全部免费毛片在线| 久久久WWW免费人成精品| 亚洲国产精品久久66| 在线看片免费不卡人成视频| 男性gay黄免费网站| 亚洲AV电影院在线观看| 欧美在线看片A免费观看| 日本一区二区三区在线视频观看免费| 国产av天堂亚洲国产av天堂| 黄色片在线免费观看| 一级毛片**免费看试看20分钟| 亚洲的天堂av无码| www亚洲精品少妇裸乳一区二区| 久久精品国产大片免费观看| 亚洲精华国产精华精华液好用| 亚洲精品午夜国产VA久久成人|