Delphi XE7的安卓程序如何调用JAVA的JAR,使用JAVA的类?
转载: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;interfaceusesSystem.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单元typeTForm1 = 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;varForm1: TForm1;testClass: JTest; // 要调用的JAVA类变量implementation{$R *.fmx}usesAndroidapi.Helpers, // JStringToStringAndroidapi.JNI.JavaTypes;// 设置JAVA类属性
procedure TForm1.Button1Click(Sender: TObject);
varname: string; // 名字属性值age: string; // 年龄属性值
begin// 得到名字name := Trim(nameEdt.Text);// 得到年龄age := Trim(ageEdt.Text);if name = '' thenbeginShowMessage('名字属性不能为空!');nameEdt.SetFocus;endelse if age = '' thenbeginShowMessage('年龄属性不能为空!');ageEdt.SetFocus;endelsebegin// 设置我们调用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);
beginMemo1.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
转载于:https://www.cnblogs.com/h2zZhou/p/5144445.html
Delphi XE7的安卓程序如何调用JAVA的JAR,使用JAVA的类?相关推荐
- 安卓程序中调用 linux 命令
博客: 安卓之家 微博: 追风917 CSDN: 蒋朋的家 简书: 追风917 在研究串口 jni 开发的时候,遇到了这样一段代码: Process su;su = Runtime.getRuntim ...
- 话说Delphi XE7编写安卓APP还是不错的,一周写一个APP系统
话说Delphi XE7编写安卓APP还是不错的,花了一周写一个APP系统,熟悉delphi开发的,很快就能开发出一个功能完善的APP系统,该系统的简单介绍, 为了配合我们的酒店系统的应用扩展, ...
- java 压缩jar 仓库,java服务安装(一):使用java service wrapper及maven打zip包
tags: java jsw maven zip 1.概述 使用java开发程序,在windows平台下,一般有web应用,后台服务应用,桌面应用: web应用多数打成war包在web容器(如tomc ...
- JAR 文件格式的强大功能(java中jar工具的使用)
大多数 Java 程序员都熟悉对 JAR 文件的基本操作.但是只有少数程序员了解 JAR 文件格式的强大功能.在本文中,作者探讨了 JAR 格式的许多功能和优势,包括打包.可执行的 JAR 文件.安全 ...
- 201671010144 2016-2017-2 《java程序设计》--认识java!
时间过的真快,还没享受够大一轻松放肆生活的我们转眼就完成了从学弟学妹到学长学姐的蜕变.比较大一时懵懵懂懂的我们,大二的我们似乎都成长了不少.人生的路就像是有好多节点构成的,每一步就是一个节点,每一节点 ...
- Java与jar之间的区别
本文翻译自:Difference between jar and war in Java What is the difference between a .jar and a .war file? ...
- java 运行jar包命令_用java –jar 命令运行Jar包
摘要 这个技巧阐明了如何不直接处理清单文件而将一个不能运行jar包转换成一个可以执行的jar包.学会如何写一段转换jar包的程序,将你的jar包转换成你能使用java -jar 命令运行jar包或象在 ...
- Java遍历jar包所有类-后续
之前,我曾经写过一篇Java遍历包中所有类,但经过一名网友提醒发现,只能适用于项目src中的包,当包在jar里时就无法遍历jar里的类.就此我针对代码进行了细化,功能得到进一步的完善. 在分享源码之前 ...
- Qt安卓开发:调用java代码的获取usb权限
最近换了工作,新工作是负责用qml做qt安卓开发. 工作中遇到一个问题:安卓设备有USB口,需要插入一个U盘在程序里读写U盘中的文件,由于安卓系统的安全性的问题导致QFile.c++的文件操作相关方法 ...
- java applet 记事本_jsb java编写的安卓app记事本程序,适合app初学者 Applet 243万源代码下载- www.pudn.com...
文件名称: jsb下载 收藏√ [ 5 4 3 2 1 ] 开发工具: Java 文件大小: 86 KB 上传时间: 2015-08-25 下载次数: 0 提 供 者: dr 详细说明:j ...
最新文章
- 用easyui动态创建一个对话框
- android中方法调用super(..)的相关知识
- 函数assert()详解
- 从技术到科学,中国AI向何处去?
- 在线预览任务调度的实现
- SAP 取月度期初库存和月度期末库存(历史库存)
- 天翼云从业认证(3.3)天翼云网络产品
- mysql数据库技术基本操作_MySQL数据库的基础操作
- 茶百科 android代码,基于android平台手机茶百科开发设计---学位论文.doc
- MySQL 中视图和表的区别以及联系是什么?
- python读取modis数据
- 解决办法:av_interleaved_write_frame()返回-22 错误
- python使用win32*模块模拟人工操作——城通网盘下载器(零)
- 【DeeCamp 优秀项目详解】从零开始到 AI 技术落地,只用三周
- c语言正确标识符怎么判断,判断C语言的标识符是否正确
- Promise中then的返回值
- 操作系统的主要功能(3)
- ubuntu 命令行 上的一些常见的快捷键和命令;无法输入字符等
- 一起来捉妖 灵石秒开过程 IOS版(越狱与不越狱都可以)
- iconfont-阿里图标库 的使用