Delphi XE7的安卓程序如何调用JAVA的JAR,使用JAVA的类?

本文使用工具和全部源码下载: 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;  

interface  

uses
  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操作全过程:

等文章整理完毕后重新提供链接!!

除了可以用 Eclipse 外,也可以用 BAT 来生成 JAR。可以参考 群共享的 JAVA 转 JAR 的例子,例子名称:JarOrClass2Pas_FlyingWang V1.0.2014.1120.zip。

群名称:①FireMonkey[移动开发] 165232328

时间: 2024-08-01 17:55:49

Delphi XE7的安卓程序如何调用JAVA的JAR,使用JAVA的类?的相关文章

Delphi XE7编译安卓程序出错了

昨天编译一个先前可以正常运行的程序,忽然就不能编译了,总是提示这个错误,经过一番排查,终于搞定了,原因:删除了安卓lib引用的JAR和单元文件.如果你也出现这个问题,打开工程全部目录,看一下是否有打小红X的地方,如果有处理完毕,再试一试!

Delphi开发安卓程序的感受

Delphi XE7开发安卓程序,界面开发速度非常快,这是eclipse无法比的,还有就是界面自适应能力很棒,我在不同版本和尺寸的设备中测试,运行良好,这些设备包括:三星I9100(安卓2.3:不到5寸屏):三星T311(安卓4:8寸屏):三星T705C(安卓4:8.4寸屏):华为X1(安卓4:7寸屏). Delphi开发的安卓程序,可以用很多Delphi的资源,我尝试用Indy TCP连接TCP服务器,已经成功,可以做EACH操作,类似资源应该有很多可以使用,这对Delphi程序员来说是非常棒

Java入门-浅析Java学习从入门到精通【转】

一. JDK (Java Development Kit)  JDK是整个Java的核心,包括了Java运行环境(Java Runtime Envirnment),一堆Java工具和Java基础的类库(rt.jar).不论什幺Java应用服务器实质都是内置了某个版本的JDK.因此掌握 JDK是学好Java的第一步.最主流的JDK是Sun公司发布的JDK,除了Sun之外,还有很多公司和组织都开发了自己的JDK,例如IBM公司开发 的JDK,BEA公司的Jrocket,还有GNU组织开发的JDK等等

关于Java引用jar是否支持通配符

Java引用jar执行命令: java -cp .:mysql-connector-java-5.1.24.jar:jdom-1.1.jar JavaCpTest 说明: -cp 和 -classpath 一样,是指定类运行所依赖其他类的路径,通常是类库,jar包之类,需要全路径到jar包,window上分号";" 分隔,linux上是分号":"分隔.不支持通配符,需要列出所有jar包,用一点"."代表当前路径. 关于jar是否支持通配符,网上答

Delphi xe7 up1 调用android振动功能

Delphi xe7 up1 调用android振动功能 振动用到以下4个单元: Androidapi.JNI.App,Androidapi.JNIBridge,Androidapi.JNI.Os,Androidapi.Helpers 使用方法: var LVibrator: JVibrator; begin LVibrator := TJVibrator.Wrap ((SharedActivity.getSystemService(TJActivity.JavaClass.VIBRATOR_S

安卓第三方动态链接库so调用,解决未对java开放的函数调用,解决类名对齐问题

SO库为Android版本连接库(*.so文件)作用:以后只要开发提供给我们接口说明,我们就可以直接做接口测试了,不再需要一个个的抓包去分析,降低做接口测试的技术难度 一般项目里调用自己的so的方法是:将SO文件直接放到libs/armeabi下,然后代码中System.loadLibrary("xxx"):再public native static int xxx_xxx_xxx():接下来就可以直接调用xxx_xxx_xxx()方法: 但是有个问题就是,必须类名对齐,而且不能调未对

不用ide编译java程序时调用jar包

调用特定目录下的jar包 javac -cp d:\javatest\dom4j.jar Dom4jDemo.java //这部分必须注意,d:\javatest 是Dom4jDemo.class所在的目录,运行时;d:\javatest 必须包括D:\javatest>java -classpath d:\javatest\dom4j.jar;d:\javatest\jaxen.jar;d:\javatest Dom4jDemo(注意jar之后的分号) //如果像下面的写法则会提示未找到Dom

慕课网-安卓工程师初养成-1-5 使用Eclipse开发Java程序

eclipse --- IDE 集成开发环境(IDE)是一类软件 将程序开发环境和程序调试环境集合在一起,提高开发效率 其他IDE,如:MyEclipse, NetBeans 下载: http://www.eclipse.org/downloads/ windows,linux,还有分32bit,64bit的版本 下载完成后解压即可使用,运行直接点击eclipse.exe,启动后设置默认工程路径 eclipse java 开发步骤 1. 创建Java项目 2. 创建程序包 3. 编写Java源程

java程序执行,调用shell命令和shell脚本

  坑呀!记得在start()之后, waitFor()之前把缓冲区读出来打log,否则是阻塞缓冲区,没有输出的 package com.jikexueyuancrm.util; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import