Delphi XE7的安卓程式如何調用JAVA的JAR,使用JAVA的類?

來源:互聯網
上載者:User

標籤:

   轉載:http://blog.csdn.net/sunylat/article/details/41414785

 

     本文使用工具和全部源碼下載:  http://download.csdn.net/detail/sunylat/8190765

     為什麼我們要在Delphi XE7的安卓程式調用JAVA的JAR,使用JAVA的類?如果能夠這樣做,那麼就意味著我們把Delphi開發的安卓程式擴充到了一個更大的開發範圍了,理論上可以調用任意JAVA編寫的代碼,對於同時精通Delphi和JAVA的程式員來說,簡直如虎添翼!!

        我差不多用了一天時間吧,最終在老貓的協助下,成功實現了在Delphi XE7的安卓程式中調用JAVA的JAR,使用JAVA的類!在此表達對老貓的謝意,同時經過老貓允許,提供老貓開發的JAVA轉PAS工具,謝謝老貓的無私分享!!

        我為大家提供的JAR,是我自己編寫的一個極其簡單的JAVA類,只提供了兩個屬性。為什麼要自己編寫一個JAVA類呢?我覺得自己對自己編寫的代碼最瞭解,也最容易儘快調試好程式,所以自己弄了這麼一個簡單的JAVA類。

        我總結,Delphi XE7的安卓程式調用JAVA的JAR,要經過這麼三個步驟:

        一,設定工程屬性。目前來看,因為Delphi工具的原因,導致按照預設屬性,無法正常運行編譯好的安卓程式,我覺得這應該是Delphi工具的BUG。

        二,產生“Native Bridge File”。這是Delphi和JAVA通訊的介面檔案,在Delphi中通過引入這個介面檔案來使用JAR裡面的JAVA類,這個檔案是必須有的。

        三,寫實際調用JAVA類的代碼。這是最終需要做的工作。

        假設你現在是Delphi和JAVA都精通的程式員,那麼我現在對上面三個步驟做詳細說明,如果你不熟悉JAVA也不要緊,在最後面,我會把我寫的JAVA類和匯出JAR的過程詳細講解一下。下面是上面的三個步驟了:

         一,設定工程屬性。目前來看,因為Delphi工具的原因,導致按照預設屬性,無法正常運行編譯好的安卓程式,我覺得這應該是Delphi工具的BUG。

        1,在你建立完工程之後,點擊"Project"->"Deployment"。

        

      2,設定屬性。

      

     做完這些,你的工程配置正確了,如果下面兩個步驟你都做好了,那麼你的Delphi XE7開發的安卓程式應該能正常調用你JAR裡面的JAVA類了!

 

      二,產生“Native Bridge File”。這是Delphi和JAVA通訊的介面檔案,在Delphi中通過引入這個介面檔案來使用JAR裡面的JAVA類,這個檔案是必須有的。

              Delphi公司提供了一個JAVA轉PAS工具,叫“java2op”,在我實際使用時候,感覺不怎麼好,有兩點:A,不能自動產生介面的GUID;B,產生的介面檔案名稱和JAVA              類名 稱不匹配。所以最終我也沒有使用它。這個工具在window虛擬機器VMware 中可以正常使用,如果你在VMware 中安裝了XE7,你可以嘗試一下。

             我使用兩個工具成功產生Native Bridge File:

             A,老貓的工具:JavaClassToDelphiUnit_FlyingWang

             B,Java2Pas:

             我認為老貓的工具更友善,更容易使用,也應該更完善,因為老貓一直在使用,不斷在改進中!所以我推薦大家使用老貓的工具!!

             下面是產生Native Bridge File過程:

             1,把要產生Native Bridge File的JAR拷貝到老貓工具目錄中。我的JAR名稱是“Test.jar”。

             

            2,用老貓工具產生Native Bridge File。

             A,選擇我們要產生Native Bridge File的JAR檔案。

              

           B,選擇Native Bridge File的輸出路徑。

           

          C,產生Native Bridge File。

          

          把這個產生的Native Bridge File拷貝到工程目錄,在工程裡面加入。

 

       三,寫實際調用JAVA類的代碼。這是最終需要做的工作。

      兩個個人觀點:

      1,介面的作用是為了定義和實現分離,那麼我們使用時候,應該定義變數為介面,實際執行個體化應該用實現這個介面的類。

      2,我們不需要釋放被調用的JAVA類,這個類被安卓虛擬機器管理,應該自動釋放。

      下面是實現的Delphi全部代碼:

     

unit Unit1;interfaceuses  System.SysUtils, System.Types, System.UITypes, System.Classes,  System.Variants,  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,  FMX.Controls.Presentation, FMX.Edit, FMX.Layouts, FMX.Memo,  Test; // 這個Test是我們剛才產生的Native Bridge File單元type  TForm1 = class(TForm)    Panel1: TPanel;    Label1: TLabel;    nameEdt: TEdit;    Label2: TLabel;    ageEdt: TEdit;    Panel2: TPanel;    Memo1: TMemo;    Button1: TButton;    Button2: TButton;    Button3: TButton;    procedure Button3Click(Sender: TObject);    procedure Button2Click(Sender: TObject);    procedure FormCreate(Sender: TObject);    procedure Button1Click(Sender: TObject);  private    { Private declarations }  public    { Public declarations }  end;var  Form1: TForm1;  testClass: JTest; // 要調用的JAVA類變數implementation{$R *.fmx}uses  Androidapi.Helpers, // JStringToString  Androidapi.JNI.JavaTypes;// 設定JAVA類屬性procedure TForm1.Button1Click(Sender: TObject);var  name: string; // 名字屬性值  age: string; // 年齡屬性值begin  // 得到名字  name := Trim(nameEdt.Text);  // 得到年齡  age := Trim(ageEdt.Text);  if name = ‘‘ then  begin    ShowMessage(‘名字屬性不可為空!‘);    nameEdt.SetFocus;  end  else if age = ‘‘ then  begin    ShowMessage(‘年齡屬性不可為空!‘);    ageEdt.SetFocus;  end  else  begin    // 設定我們調用JAVA類裡的name屬性值    testClass.setName(StringToJString(name));    // 設定我們調用JAVA類裡的age屬性值    testClass.setAge(TJInteger.JavaClass.init(StringToJString(age)));  end;end;// 得到設定的JAVA類屬性procedure TForm1.Button2Click(Sender: TObject);begin  // 清空原有顯示資料  Memo1.Text := ‘‘;  // 顯示得到的被調用JAVA類裡的name屬性值  Memo1.Lines.Add(JStringToString(testClass.getName));  // 顯示得到的被調用JAVA類裡的age屬性值  Memo1.Lines.Add(JStringToString(testClass.getAge.toString));end;// 清空顯示內容procedure TForm1.Button3Click(Sender: TObject);begin  Memo1.Text := ‘‘;end;// 執行個體化J要調用的AVA類procedure TForm1.FormCreate(Sender: TObject);begin  // 執行個體化要調用的JAVA類  testClass := TJTest.JavaClass.init;  // 設定名字屬性值  testClass.setName(StringToJString(‘TestName‘));  // 設定年齡屬性值  testClass.setAge(TJInteger.JavaClass.init(StringToJString(‘20‘)));end;end.

 

此例子中的Eclipse操作全過程:

http://blog.csdn.net/sunylat/article/details/41422103

 

 

 除了可以用 Eclipse 外,也可以用 BAT 來產生 JAR。可以參考 群共用的 JAVA 轉 JAR 的例子,例子名稱:JarOrClass2Pas_FlyingWang V1.0.2014.1120.zip。 群名稱:①FireMonkey[移動開發] 165232328

 

Delphi XE7的安卓程式如何調用JAVA的JAR,使用JAVA的類?

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.