標籤:
轉載: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的類?