另辟奚径-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,后面有时间整理好分享给大家。

          

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

QDockWidget组件的隐藏与显示(按钮控制)

本文内容包括: 1、控制按钮的点击效果美化; 2、用按钮控制QDockWidget组件的隐藏与显示; 参考前提:已有.ui文件、已有QDockWidget组件、已有一个控制QDockWidget组件的按钮 实现效果: DockWidget组件的隐藏与显示&…

mac 无法 push 代码到 github 报错:Couldn‘t connect to server 或者 无法克隆 github 仓库 ,克隆进度卡住

开启代理后上传代码报错 Failed to connect to github.com port 443 after 75108 ms: Couldn’t connect to server 解决方法 在 网络 设置里查看代理端口号 开启配置 http、https 全局代理 git config --global http.proxy http://127.0.0.1:你所查询的端口号 git confi…

一种ADC采样算法,中位值平均滤波+递推平均滤波

前言 在实际AD采集场景中,会出现周期性变化和偶然脉冲波动干扰对AD采集的影响 这里使用中位值平均滤波递推平均滤波的结合 参考前人写好的代码框架,也参考博主GuYH_下面这篇博客,在此基础上稍作修改,写出这篇博客,能…

SFTP远程终端访问

远程终端访问 当服务器部署好以后,除了直接在服务器上操作,还可以通过网络进行远程连接访问CentOS 7默认支持SSH(Secure Shell, 安全Shell 协议),该协议通过高强度的加密算法提高了数据在网络传输中的安全性,可有效防止中间人攻击(Man-in-th…

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

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

Windows10+vs2015源码编译subversion

Windows源码安装subversion 一、运行环境 windows10 64位系统 VS2015完整安装 Subversion1.6.3 二、源码编译环境配置 1、python环境安装 python-2.4.msi2、perl环境安装 ActivePerl-5.8.8.822-MSWin32-x86-280952.msi3、openssl编译 C:>cd openssl-0.9.7f C:>p…

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

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

拦截器学习(黑马程序员)

实现步骤: 定义拦截器注册配置拦截器 1 自定义拦截器:实现HandlerInterceptor接口,并重写其所有方法: //自定义拦截器 Component public class LoginCheckInterceptor implements HandlerInterceptor { //目标资源方法执行前执…

Linux的基本指令(1)

目录 快速认识的几个指令 pwd指令 mkdir指令 touch指令 cd指令 clear指令 whoami指令 ls指令 ls -l ls -la ls 目录名 ls -ld 目录名 文件 路径 路径是什么? 路径的形成 ​ 怎么保证路径必须有唯一性? ls -la隐藏文件 隐藏文件的是什…

[量化投资-学习笔记009]Python+TDengine从零开始搭建量化分析平台-KDJ

技术分析有点像烹饪,收盘价、最值、成交量等是食材;均值,移动平均,方差等是烹饪方法。随意组合一下就是一个技术指标。 KDJ又称随机指标(随机这个名字起的很好)。KDJ的计算依据是最高价、最低价和收盘价。…

思维模型 梅拉宾法则

1 梅拉宾法则的应用 1.1 演讲口才中的梅拉宾法则应用 苹果公司的演讲:苹果公司的演讲一直以来都以其独特的风格和效果著称。苹果公司的演讲者在演讲中注重运用肢体语言和声音等非语言因素,如手势、表情和语调等,来增强演讲的效果。例如&am…

想要和猫妹一起学Python吗?快进群吧

这是一篇2024年猫妹学Python新同学召集令,感兴趣的朋友可以看下。 初始Python 猫爸第一次被Python惊艳,是几年前的一个风格迁移程序。 国外某大学的一篇博士论文,为风格迁移提供了理论支撑。 下载到模型之后,就可以用简单的Py…

SpringCloud——消息驱动——Stream

1.什么是消息驱动 消息驱动就是屏蔽底层消息中间件的差异,降低切换成本,统一消息的编程模型。目前仅支持RabbitMQ、Kafka。 2.消息中间件有什么问题,stream靠什么实现? 如果我们项目用到了RabbitMQ和Kafka,由于这两个…

93. 递归实现组合型枚举

题目 思路 一个m个坑位&#xff0c;填n个数&#xff0c;就依次往里放就好了 同时判断一下升序&#xff0c;当前这个数比前一个数大就可以了 代码 #include <bits/stdc.h> using namespace std; int n, m; int ans[30]; int f[30]{0}; void dfs(int v) {if (v > m) …

C++---类的优化构造

首先&#xff0c;先介绍以下拷贝构造和构造的区别。 拷贝构造Date&#xff08;Date& d&#xff09;初始化&#xff1a;用一个实例对象去初始化一个未初始化的对象&#xff0c; 例&#xff1a;如果d1未被实例化&#xff0c;则Date d1 d2; 也会被编译器认为拷贝构造&#…

智慧工地建筑施工项目管理平台源码,实现人员劳务实名制管理、区域安防监控、智能AI识别、用电/水监控、噪音扬尘监测、现场物料管理等功能

智慧工地管理系统源码&#xff0c;智慧工地云平台源码&#xff0c;PC端APP端源码 智慧工地管理平台实现对人员劳务实名制管理、施工进度、安全管理、设备管理、区域安防监控系统、智能AI识别系统、用电/水监控系统、噪音扬尘监测、现场物料管理系统等方面的实时监控和管理&…

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

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

华硕荣获“EPEAT Climate+ Champion”永续先驱称号

华硕持续深耕永续理念&#xff0c;努力提供低碳排放、高效能产品&#xff0c;并被全球电子委员会授予“EPEAT Climate Champion”称号。这一荣誉再次表明了华硕在永续管理方面的承诺&#xff0c;并凸显了华硕在追求永续发展上的决心。 华硕通过设立“科学基础减碳目标”、“再生…

工资10K,副业20K,这届程序员搞副业真野

最近刚完成了一个远程外包项目工作&#xff0c;钱刚到账&#xff0c;小金库又添了一笔&#xff1a; 从一开始的15K死工资&#xff0c;到现在的主业副业一共25K收入&#xff0c;最近的经济压力小了很多&#xff0c;终于也有闲钱和老婆去旅旅游&#xff0c;升级一下外设&#xff…

Linux学习教程(第一章 简介)3

第一章 简介 七、Linux系统的优缺点 前面章节提到&#xff0c;相比 Windows 系统&#xff0c;Linux 系统有更好的稳定性&#xff0c;那么除此之外&#xff0c;Linux 系统还有那些优点&#xff08;或者不足&#xff09;呢&#xff1f;本节带领大家详细了解一下。 1、大量的可…