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

              

  • 相关阅读:
    MyBatisPlus(十八)字段类型处理器:对象存为JSON字符串
    LyScript 内存交换与差异对比
    计算机毕业设计 基于微信小程序的“共享书角”图书借还管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解
    QOne、QData开关机操作
    使用open as方法对文件进行操作
    在Application中使用代码自动判断APP是否为release版本
    CentOS8/RHEL8 root密码破解
    CTF_RSA解密学习
    京东云开发者|经典同态加密算法Paillier解读 - 原理、实现和应用
    经典面试题 | 讲一讲 JVM 的组成
  • 原文地址:https://blog.csdn.net/tjsoft/article/details/134346659