本文使用工具和全部源码下载: 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. email 解析 ,发送 邮件

    email 来源:https://blog.csdn.net/xyang81/article/details/7675160     详见此人其它mail 篇 参考2:http://lib.csdn. ...

  2. 学习Maven之PropertiesMavenPlugin

    1.PRoperties-maven-plugin是个什么鬼? 介绍前我们先看一个问题,比如我们有一个maven项目结构如下:一般我们都把一些配置文件放到像src/main/resources/jdb ...

  3. JAVA 获取文件的MD5值大小以及常见的工具类

    /** * 获取文件的MD5值大小 * * @param file * 文件对象 * @return */ public static String getMD5(File file) { FileI ...

  4. Git--时光穿梭机之删除文件06

    在Git中,删除也是一个修改操作,我们实际操作一下吧,先添加一个文件test.txt到Git并且提交 $ git add test.txt $ git commit -m "add test ...

  5. JS在生成csv文件时,","逗号问题处理.

    在生成csv文件时,发现一个问题,因为csv文件本身是依靠逗号进行分列的,所以内容中有逗号时也被强制分列了,处理方法很简单,为内容加上双引号(英文格式)就可以了. 如: "11111,222 ...

  6. 迷你MVVM框架 avalonjs 学习教程6、插入移除处理

    ms-if是属于流程绑定的一种,如果表达式为真值那么就将当前元素输出页面,不是就将它移出DOM树.它的效果与上一章节的ms-visible效果看起来相似的,但它会影响到:empty伪类,并能更节约性能 ...

  7. Linux之RPM GPG签名

    原文地址:http://linux.chinaunix.net/techdoc/system/2007/09/26/968723.shtml GPG在Linux上的应用主要是实现官方发布的包的签名机制 ...

  8. Excel中保留有效数字的问题

    在工作表界面中按 <alt>+<F11>,进入代码页面,然后再 WORKBOOK中插入模块,把以下代码COPY入模块中.就可以在工作表中使用 =YXSZ(数值,保留位数). 如 ...

  9. Docker添加官方加速源(必须)

    在国内使用Docker必须用加速镜像不然的话无论是pull 官方的还是私有的镜像都会WAIT TIME EXCEED 下面给出macos的添加方式,非常简单 macOS 对于使用 macOS 的用户, ...

  10. Android 上传文件到XP

    Android部分: AsyncHttpClient client = new AsyncHttpClient(); RequestParams requestParams = new Request ...