另辟奚径-Android Studio调用Delphi窗体

大家都知道Delphi能调用安卓SDK,比如jar、aar等,

但是反过来,能在Android Studio中调用Delphi开发的窗体吗?

想想不太可能吧,

Delphi用的是Pascal,Android Studio用的是Java,这两个怎么能混用呢?

而且用Delphi就能开发好APP,为啥还要用到Android Studio?

搞这个的人,得是有多闲!

就让我这个闲得蛋疼的人来尝试一下。

首先用Delphi建一个工程,

如下Delphi工程,

名为EmptyDelphi:

差不多是一个空的工程,就只有一个很简单的窗体,上面放了按钮,点击弹出:

"Hello,我是Delphi窗体。"

将它在Android 64位平台下Build一下,

会生成我们后面需要的文件,

它是Android64\Release目录中的libEmptyDelphi.so,

so文件是安卓下的动态链接库,

Delphi将工程的窗体和代码都编译到它里面了:

在手机上跑一下看看:

注意顶部状态栏,是灰黑色的。

再用Android Studio来新建一个工程(简单看看即可):

填入APP名称、应用包名等:

可以新建一个Activity来玩下原生开发(在安卓下的窗体叫Activity):

窗体名设置为MainActivity,

默认勾上Generate a Layout File,表示新建一个窗体布局文件,就像Delphi中的窗体是一对.pas+.fmx文件,而安卓下窗体是一对.java+.xml文件,

如果勾上Launcher Activity,表示它是主窗体,程序一打开就显示它,

如下图所示:

双击res\layout\activity_main.xml来在窗体上添加控件:

双击就能打开窗体设计器:

从左边拖个按钮进去,这种可视化的方式和Delphi一样:

如果建Activity的时候没有勾上Launcher Activity,

那么需要编辑AndroidManifest.xml,

AndroidManifest.xml是安卓程序清单文件,里面登记着所有安卓窗体、服务等,

打开左边manifests节点里面的AndroidManifest.xml进行编辑:

在Activity节点里面加入如下XML节点,

表示它是一个主窗体,app一运行首先打开它,如下图所示:

点击下右上角的绿色小箭头就能直接运行在手机上:

效果如下图所示:

接下来把Delphi开发的窗体集成进来作为主窗体:

要想在安卓应用中打开页面,就需要在AndroidManifest.xml中注册一个Activity,

那么我们Delphi开发的窗体有Activity吗?

它叫什么呢?

我们可以打开Android64\Release\AndroidManifest.xml找到答案:

(或者工程目录中的AndroidManifest.template.xml中)

如上图,Delphi开发的窗体Activity为com.embarcadero.firemonkey.FMXNativeActivity,它是固定的,只是其中meta-data节点中的value值会变,是需要一个动态库文件名,为工程名称。

那我们把这一段复制到Android Studio工程中的AndroidManifest.xml中去:

并把Android Studio工程中原来的MainActivity注释掉:

但是可以看到我们Delphi的FMXNativeActivity粘到Android Studio中之后,

都标红了,应该是出错了,鼠标移上去,

提示"Class referenced in the manifest,com.embarcadero.firemonkey.FMXNativeActivity was not found in the project or the libraries",

意思是在工程或库中不存在这个FMXNativeActivity,

那它在哪里?

答案是fmx.jar

Delphi开发的app需要使用fmx.jar来实现一些底层的安卓功能,

我们平常可以在Delphi 工程视图中Android平台下的Libraries节点中看到它:

fmx.jar它在Delphi的安装目录中:

C:\Program Files (x86)\Embarcadero\Studio\22.0\lib\android\release

fmx.dex.jar则是fmx.jar编译之后的文件。

fmx.jar的源码都在Delphi的源码目录中,

C:\Program Files (x86)\Embarcadero\Studio\22.0\source\rtl\androiddex\java\fmx

这个目录一看就是一个Eclipse项目,

找到FMXNativeActivity这个类,它是Embarcadero用java写的,

所以要想在Android Studio中使用Delphi的页面,那么就需要引用fmx.jar。

在Android Studio中引用fmx.jar

将它拷到安卓工程app目录中的libs目录里面,

找到工程app模块的安卓配置文件 build.gradle,它是安卓应用的打包配置文件:

编辑它,在它的dependencies(依赖)中加入如下一行,

implementation fileTree(include: ['*.jar','*.aar'], dir: 'libs')

表示app需要引用libs目录中的所有jar和aar:

改了build.gradle之后,右上角会有"Sync Now",需要点击:

你的APP如果用到了别的aar、jar也都放到libs目录中来。

因为FMXNativeActivity在创建的时候会加载libEmptyDelphi.so这个文件,

我们需要将它布署到library\lib\arm64-v8a目录中,

先将libEmptyDelphi.so拷到安卓项目app\libs\arm64-v8a目录中,

把这个so布署进去,

编辑app模块中的build.gradle,在android节点中加入:

sourceSets {

main {

jniLibs.srcDirs = ['libs']

}

}

如下图所示:

好了,在Android Studio中运行工程到手机:

看看顶部状态栏,它是蓝色的。

现在我们成功的用Android Studio将Delphi窗体打包进去了,

其实就类似在Windows平台将Delphi窗体封装进DLL,然后给C#调用来显示它们。

这么做有什么好处呢?

1.集成aar方便稳定,特别是遇到实在解决不了的闪退卡死等情况

如果Delphi APP引用了太多的aar,我们不仅需要自己处理依赖包的下载、资源的合并,编译R.jar,除此之外经常会遇到闪退卡死等问题,非常难排查,

用Android Studio就不会有这种问题的产生,直接在build.gradle中编辑好:

Gradle插件直接帮你自动完成全部工作。

2.打包安卓应用快

当你的Delphi APP引用了太多了aar之后,要布署相当多的资源文件,用Delphi打包APK的过程就会显示相当的漫长,我有一个项目打包一次在五分钟左右,

而用Android Studio打包,则一分钟都不到。

3.与安卓原生协同开发

你可以将你的工程编译为安卓链接库给原生java他们调用。

当然Delphi也可以使用Gradle插件来自动集成aar,后面有时间整理好分享给大家。

相关推荐
编程洪同学1 小时前
Spring Boot 中实现自定义注解记录接口日志功能
android·java·spring boot·后端
乐闻x3 小时前
VSCode 插件开发实战(十二):如何集成Git操作能力
ide·git·vscode
氤氲息3 小时前
Android 底部tab,使用recycleview实现
android
Clockwiseee4 小时前
PHP之伪协议
android·开发语言·php
小林爱4 小时前
【Compose multiplatform教程08】【组件】Text组件
android·java·前端·ui·前端框架·kotlin·android studio
小何开发5 小时前
Android Studio 安装教程
android·ide·android studio
开发者阿伟5 小时前
Android Jetpack LiveData源码解析
android·android jetpack
weixin_438150996 小时前
广州大彩串口屏安卓/linux触摸屏四路CVBS输入实现同时显示!
android·单片机
CheungChunChiu6 小时前
Android10 rk3399 以太网接入流程分析
android·framework·以太网·eth·net·netd
木头没有瓜7 小时前
ruoyi 请求参数类型不匹配,参数[giftId]要求类型为:‘java.lang.Long‘,但输入值为:‘orderGiftUnionList
android·java·okhttp