本文使用工具和全部源码下载: 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('')));
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的类?的更多相关文章

  1. Delphi XE7编译安卓程序出错了

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

  2. PHP通过php-java-bridge调用JAVA的jar包里class类

    正 文:   有的时候我们需要在PHP里调用JAVA平台封装好的jar包里的class类和方法,一般飘易推荐的做法是采用php-java-bridge做桥接,本文就来介绍一下大致的实现方法. 先简单说 ...

  3. java 执行jar包里面一个类class文件

    一.环境: 1. linux 2. 有两个java类,A.java和B.java,都在同一个目录下 二.源码: A.java   package com.abc;   public class A { ...

  4. Delphi开发安卓程序的感受

    Delphi XE7开发安卓程序,界面开发速度非常快,这是eclipse无法比的,还有就是界面自适应能力很棒,我在不同版本和尺寸的设备中测试,运行良好,这些设备包括:三星I9100(安卓2.3:不到5 ...

  5. Delphi XE7中开发安卓程序一些有用的帮助资源

    说明:要想看到下面资源,打开帮助后,在搜索里面输入URL最后一部分,如果最后带“.html”,则把它删除,随后搜索一下,就看到了. 例如:想看下面的FireMonkey类关系图,只在搜索里面输入&qu ...

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

    一. JDK (Java Development Kit)  JDK是整个Java的核心,包括了Java运行环境(Java Runtime Envirnment),一堆Java工具和Java基础的类库 ...

  7. Delphi XE7调用Java Class,JAR

    Delphi XE5,XE6需要用户手工编译并将Classes.Dex加入到包中,不过Delphi XE7可以省掉这些工作了. 如何在XE7中调用Java,具体步骤如下: 1.将jar文件添加到XE7 ...

  8. Unity开发Android应用程序:调用安卓应用程序功能

    开发环境: Eclipse3.4 + adt12 + jdk6 + AndroidSDK2.2 Unity3.4 + windows7 测试设备: HTC Desire HD 本文要涉及到的几个重点问 ...

  9. Delphi XE7调用C++动态库出现乱码问题回顾

    事情源于有个客户需使用我们C++的中间件动态库来跟设备连接通讯,但是传入以及传出的字符串指针格式都不正确(出现乱码或是被截断),估计是字符编码的问题导致.以下是解决问题的过程: 我们C++中间件动态库 ...

随机推荐

  1. leetcode172

    public class Solution { public int TrailingZeroes(int n) { ) { ; } else { ; var y = TrailingZeroes(x ...

  2. delphi 路径函数

    delphi path functionIncludeTrailingPathDelimiterIncludeTrailingPathDelimiter ensures that a path nam ...

  3. VMware CentOS Device eth0 does not seem to be present

    在VMware里克隆出来的CentOS Linux.. ifconfig...没有看到eth0..然后重启网卡又报下面错误. 故障现象: service network restartShutting ...

  4. Nginx 图片服务器搭建

    安装Nginx >yum install -y nginx 安装vsftpd  http://www.cnblogs.com/eason-d/p/9057389.html 2: 创建目录 /us ...

  5. Hive的安装和建表

    目录 认识Hive 1. 解压 2. 配置mysql metastore(切换到root用户) 3. 配置hive 4. 安装hive和mysq完成后,将MySQL的连接jar包拷贝到$HIVE_HO ...

  6. S 合伙人

    [Public] ConnectString=host="siebel://10.10.0.46:2321/HC_CRM/SMObjMgr_chs ConnectUserName=SADMI ...

  7. Halcon选择一堆region中面积第N大的region的算法实现

    以下图为例: 比如我想把面积第2小的那个“小正方形”选择出来,算法代码如下: read_image (Yuan, 'C:/Users/happy xia/Desktop/yuan.png') bina ...

  8. Zookeeper 源码(二)序列化组件 Jute

    Zookeeper 源码(二)序列化组件 Jute 一.序列化组件 Jute 对于一个网络通信,首先需要解决的就是对数据的序列化和反序列化处理,在 ZooKeeper 中,使用了Jute 这一序列化组 ...

  9. jquery破坏链

  10. Adobe Photoshop CC 2015安装激活教程

    Adobe Photoshop CC 2015安装激活教程(附序列号) Adobe Photoshop CC 2015是Adobe针对旗下的创意云Creative Cloud 套装推出了2015年年度 ...