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

news2024/11/20 7:16:52

大家都知道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,后面有时间整理好分享给大家。

          

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1195884.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI时代如何提升自己晋升力

要在AI时代提升职场晋升力,采取以下详细策略: 终身学习的实践: 专业课程: 定期参加在线课程或研讨会,如Coursera、edX等,学习最新的AI技术和行业动态。行业资讯: 订阅相关的行业杂志、博客&…

通过海康私有协议Ehome/ISUP协议将海康摄像头、录像机等设备统一接入到LiveNVR Web流媒体平台实现统一汇聚及Web播放等的配置说明,

LiveNVR海康摄像头海康NVR通过EHOME协议ISUP协议接入支持转GB28181级联 1、海康 ISUP 接入配置2、海康设备接入2.1、海康EHOME接入配置示例2.2、海康ISUP接入配置示例 3、通道配置3.1、直播流接入类型 海康ISUP3.2、海康 ISUP 设备ID3.3、启用保存3.4、接入成功 4、相关问题4.1…

初识RabbitMQ - 安装 - 搭建基础环境

RabbitMQ 各个名词介绍 Broker:接收和分发消息的应用,RabbitMQ Server 就是 Message Broker Virtual host:出于多租户和安全因素设计的,把 AMQP 的基本组件划分到一个虚拟的分组中,类似于网络中的 namespace 概念。当…

毅速课堂丨3D打印随形水路在注塑生产中的优势

随着科技的不断发展,3D打印技术已经成为了模具制造领域的一种重要技术。其中,3D打印随形水路在注塑生产中的应用也越来越广泛。 3D打印随形水路在注塑生产中的优势主要有以下几点: 一、提高生产效率 3D打印随形水路可以根据注塑产品的形状和…

帝国cms中如何让外部链接直接从新窗口打开页面

<?php if($bqr[isurl]) { ?> <a href"<?$bqsr[titleurl]?>" target"_blank"> <?php } else { ?> <a href"<?$bqsr[titleurl]?>"> <?php } ?>

.NET快速对接极光消息推送

什么是消息推送&#xff1f; 很多手机APP会不定时的给用户推送消息&#xff0c;例如一些新闻APP会给用户推送用户可能感兴趣的新闻&#xff0c;或者APP有更新了&#xff0c;会给用户推送是否选择更新的消息等等&#xff0c;这就是所谓的“消息推送”。 常见的一些APP消息推送…

使用idea插件快速生成arthas命令

这里分享一个插件&#xff0c;叫做arthas idea。 这个插件我主要是用来在本地生成一些要使用的arthas命令&#xff0c;然后复制到线上使用&#xff0c;这样可以避免记忆大量的arthas命令&#xff0c;加速排查效率&#xff0c;不过哪种情况要用哪些arthas命令&#xff0c;还是需…

Mac下eclipse配置JDK

一、配置JDK&#xff0c;需要电脑下载Java并且配置环境 Mac环境配置&#xff08;Java&#xff09;----使用bash_profile进行配置&#xff08;附下载地址&#xff09; (1)、左上角找到“Eclipse”-->“Preferences...” (2)、找到“Java”-->“Installde JREs”-->界…

【Acwing171】送礼物(双向dfs)题解

本题思路来源于acwing算法提高课 题目描述 看本文需要准备的知识 1.二分&#xff08;强烈推荐文章&#xff1a;http://t.csdnimg.cn/Mx9Lr&#xff09; 2.dfs基本思想&#xff0c;了解“剪枝”这个术语 思路分析 首先这道题目看起来就是一个01背包&#xff0c;但是如果直接…

机器学习算法——线性回归与非线性回归

目录 1. 梯度下降法1.1 一元线性回归1.2 多元线性回归1.3 标准方程法1.4 梯度下降法与标准方程法的优缺点 2. 相关系数与决定系数 1. 梯度下降法 1.1 一元线性回归 定义一元线性方程 y ω x b y\omega xb yωxb 则误差&#xff08;残差&#xff09;平方和 C ( ω , b ) …

【LeetCode】每日一题 2023_11_11 情侣牵手(并查集/贪心)

文章目录 刷题前唠嗑题目&#xff1a;情侣牵手题目描述代码与解题思路偷看大佬题解 结语 刷题前唠嗑 LeetCode? 启动&#xff01;&#xff01;&#xff01; 好好好&#xff0c;这么玩是吧&#xff0c;双十一出道情侣牵手 题目&#xff1a;情侣牵手 题目链接&#xff1a;765…

[LeetCode]-225. 用队列实现栈-232. 用栈实现队列

目录 225. 用队列实现栈 题目 思路 代码 232. 用栈实现队列 题目 思路 代码 225. 用队列实现栈 225. 用队列实现栈 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/implement-stack-using-queues/description/ 题目 请你仅使用两个队列实现一个后…

基于SSM的电子病历系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

ubuntu上如何移植thttpd

thttpd的特点 thttpd 是一个简单、小巧、便携、快速且安全的 HTTP 服务器。 简单&#xff1a; 它只处理实现 HTTP/1.1 所需的最低限度。好吧&#xff0c;也许比最低限度多一点。 小&#xff1a; 请参阅比较图表。它还具有非常小的运行时大小&#xff0c;因为它不会分叉并且非…

Auto-Encoder学习笔记

写在前面 本篇博客是本人在学习李宏毅老师的《机器学习》课程中的Auto-Encoder时&#xff0c;记录的相关笔记&#xff0c;由于只记录了我认为相对重要的部分&#xff0c;所以可能有未记录的部分。博客中的图片来自于教学视频中的截图&#xff0c;视频资源地址为&#xff1a;传…

火山引擎公共云·城市分享会:共享云经验,一起向未来

数智化时代的来临&#xff0c;不仅激发了行业对云计算的资源需求&#xff0c;也重构了云计算的技术架构及产品布局&#xff0c;给业务场景带来更多可能性&#xff0c;让云计算成为企业走向高效治理的一剂“良方”。随着业务的多样化、复杂化&#xff0c;企业应该如何借助云计算…

省钱攻略:三大运营商保号套餐办理攻略,不再当冤大头!

现在的朋友都是相当的聪明&#xff0c;都不想直接在营业厅办理套餐&#xff0c;而是选择保号套餐流量卡。 今天&#xff0c;小编主要介绍的就是三大运营商的保号套餐&#xff0c;以及如何办理&#xff01; 如图所示&#xff1a; ​  电信最低可改5元套餐&#xff0c;移动、联…

软件之禅(七)面向对象(Object Oriented)

黄国强 2023/11/11 前文提到面向对象构建的模块控制器&#xff0c;根据第一性原理&#xff0c;从图灵机的角度&#xff0c;面向对象不是最基本的元素。那么面向对象是不是不重要呢&#xff1f; 答案是否定的&#xff0c;面向对象非常非常重要。当我们面对一个具体的领域…

【CASS精品教程】cass3d基于DOM和DEM生成倾斜三维模型

和EPS一样&#xff0c;cass3d也可以生成三维模型。本文讲解 cass3d基于pix4d生成的正射影像DOM和DSM生成倾斜三维模型&#xff0c;并进行三维测图。 一、三维倾斜模型打开 打开cass11.0软件&#xff0c;打开三维窗口&#xff0c;点击打开模型&#xff0c;选择基于dom和dsm生成…

Leetcode 剑指 Offer II 052. 递增顺序搜索树

题目难度: 简单 原题链接 今天继续更新 Leetcode 的剑指 Offer&#xff08;专项突击版&#xff09;系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 给你一棵二叉搜索树&#xff0c;请 按中序遍历 将其重新排列为一…