全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:729
推到 Plurk!
推到 Facebook!

Delphi Firemonkey 在 Android 里面调用 Java 的库

 
pcplayer99
尊榮會員


發表:142
回覆:739
積分:591
註冊:2003-01-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2016-09-30 20:52:45 IP:120.237.xxx.xxx 訂閱
Delphi 在安卓下调用 Java 的库的方法:

查了一天的资料,终于搞明白是怎么回事。

要点:
1. Java 的库,编译为 jar 文件,可以被 delphi 调用(.class 文件也可以,不过没测试);
2. 将这个 jar 文件,创建它的 pascal 代码的接口文件。创建方法是用工具软件(估计知道规则,自己手写也可以,不过肯定很麻烦)。
3. 在 Delphi 里面:
3.1. 将这个 jar 引入到工程里面。方法是,在 IDE 的右侧的 Project Manager 的窗口里面,在工程底下的 Target Platforms 底下的 Android 底下,选择拉开 Libraries ,右键点,选 Add 菜单,选择这个 jar 文件,将它加入进去。
3.2. 工程里面加入接口的 pascal 文件。
4. 在需要用到这个 jar 库的地方,uses 这个接口文件,定义其接口,创建接口实例,使用接口方法。
5. 如何释放接口?发现使用了 jar 的实例后,就算将 delphi 的接口释放为 nil,程序还是无法关闭。

细节:
1. 从 jar 自动生成 delphi 接口文件的方法:
1.1. Delphi 官方提供的 Java2OP.exe 工具:此工具在官方网站需要注册用户才能下载。我从其它网站下载的,能用,能生成 Delphi 的接口文件。但生成的文件问题很多,无法编译通过。
1.2. Java2Pas: 这个工具,可以创建 delphi 接口文件。但它是需要注册的。我下载的是试用版,它生成的 delphi 文件里面,接口定义有了,接口里面的函数没有。手动加上函数后,测试可以使用。
1.3. 国内一位叫老猫的网友开发的工具,JavaClassToDelphiUnit_FlyingWang.exe 这个工具看起来本身是 Delphi 写的,而且是 GUI 界面的。用它去创建给定的 jar 文件的 Delphi 接口文件,可以使用,测试通过。

相关资源:
1. http://blog.csdn.net/sunylat/article/details/41414785 这篇文章比较详细地说明了怎么在 Delphi 底下调用 Java 库。这篇文章也提供了工具下载链接。
2. 工具下载链接:http://download.csdn.net/detail/sunylat/8191291 这里面有工具,和一个测试用的简单的 jar ,以及调用这个 jar 的 delphi 代码。

需要注意的问题:
1. 按照前述做法,在 XE7 和 XE10 底下,都能编译通过,但发布会失败。失败的错误LOG是:[PAClient Error] Error: E2312 Unable to execute ....
1.1. 按照错误提示,将发布的命令,用命令行窗口直接调用执行,获得的错误提示是:Tag missing required attribute name. 看起来似乎是 XML 文件里面多出来的 这一行有问题。因此,删除掉这一行以后执行发布,就会成功。
2. XE7 底下,删除工程文件夹下面的 AndroidManifest.template.xml 文件,重新编译发布,成功。
3. XE10 底下如上操作,出同样问题。
4. 通过对比 XE7 底下成功的 AndroidManifest.xml (位于工程文件夹/Android/Debug 里面),发现 XE10 的这个文件,在第 33 行多出来一行:,将这行屏蔽掉以后再次发布(仅仅是执行 IDE 菜单里面的 Project/Deploy ...),发布成功,会在工程的对应文件夹底下创建 apk 文件。将 apk 文件拷贝到手机里面安装运行,测试通过。
5. XE10 每次 Build 都会重新创建 AndroidManifest.xml,都会加上 这一行。但如果不引入 jar 库,则不会产生这一行。
6. 不是删除掉那一行,而是修改为它加上名字,变成:
android:exported="false" />
然后在 IDE 里面执行发布,成功。

7. 上述做法,就无法直接在 Debug 底下 Run 进手机。因为它会首先 Build 然后 Deploy 进手机。
7.1. 测试将工程目录下的 AndroidManifest.template.xml 里面的 <%service%> 删除掉,然后重新 Build 发现它不会在 AndroidManifest.xml 里面生成 这一行,然后发布就会成功。直接连上手机点 Run,确实可以直接发布进手机而且运行起来。测试通过。

-------------------
结论:
1. 用老猫的工具 JavaClassToDelphiUnit_FlyingWang.exe 可以成功从 jar 生成 Delphi 的接口文件;
2. 将 jar 文件加入到工程里面的 Android 底下的库里面;
3. 修改工程文件夹底下的 AndroidManifest.template.xml,去掉里面的 <%service%>;
4. 可以正常编译发布运行了。

-------------------
创建 APK 的命令行:
"C:\Users\Public\Documents\Embarcadero\Studio\17.0\PlatformSDKs\android-sdk-windows\build-tools\22.0.1\Aapt.exe" package -f -M "F:\BitEye\Pro\Test\FireMonkeyCallJava\Android\Debug\testCallJava\AndroidManifest.xml" -F "F:\BitEye\Pro\Test\FireMonkeyCallJava\Android\Debug\testCallJava\bin\testCallJava-unsigned.apk" -I "C:\Users\Public\Documents\Embarcadero\Studio\17.0\PlatformSDKs\android-sdk-windows\platforms\android-22\android.jar" -S "F:\BitEye\Pro\Test\FireMonkeyCallJava\Android\Debug\testCallJava\res" -A "F:\BitEye\Pro\Test\FireMonkeyCallJava\Android\Debug\testCallJava\assets" "F:\BitEye\Pro\Test\FireMonkeyCallJava\Android\Debug\testCallJava\library" "F:\BitEye\Pro\Test\FireMonkeyCallJava\Android\Debug\testCallJava\classes"
pcplayer99
尊榮會員


發表:142
回覆:739
積分:591
註冊:2003-01-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2016-10-09 22:13:42 IP:120.237.xxx.xxx 訂閱
视频教学: https://www.youtube.com/watch?v=mDq-MwkExng
http://v.youku.com/v_show/id_XMTMyMTI5MDAzNg==.html?from=y1.2-3.4.1
上面两个地址,是同一个视频。这个视频很清楚地讲了 Delphi 里面如何调用 Java 的类。里面用到的工具是 Java2OP.exe,这个已经在 Delphi XE10 里面自带了,在 DELPHI 安装目录底下:C:\Program Files (x86)\Embarcadero\Studio\17.0\bin\converters\java2op
GrandRURU
站務副站長


發表:234
回覆:1651
積分:1742
註冊:2005-06-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2016-10-11 11:03:05 IP:59.120.xxx.xxx 未訂閱
謝謝分享!
stacker_liew
初階會員


發表:48
回覆:111
積分:46
註冊:2004-05-17

發送簡訊給我
#4 引用回覆 回覆 發表時間:2016-11-11 15:04:13 IP:42.153.xxx.xxx 未訂閱
其實官方已經幫我們寫好了一堆連接爪哇的仲介放在source/rtl/android底下,有空不妨去那邊看看,玩玩。
有很多好玩的東西在那邊,但是如果用了這些東西,就失去了跨平臺的意義了。
編輯記錄
stacker_liew 重新編輯於 2016-11-11 15:05:00, 註解 無‧
系統時間:2017-10-24 17:39:45
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!