|
|
导航: |
论坛 -> 移动应用开发
斑竹:flyers,iamdream |
|
作者: |
dorry (littlecat) |
★☆☆☆☆ |
-
|
盒子活跃会员 |
|
2023/5/31 8:32:36 |
标题: |
delphi11怎样 编译生成 android 下使用的动态库? |
浏览:890 |
|
加入我的收藏 |
楼主: |
如题,delphi11 可以编译 android下使用的 .so 动态库吗?
----------------------------------------------
泱泱华夏十亿兵,国耻期待儿孙平,愿提十万虎狼旅,跃马扬刀灭东京! |
作者: |
|
2023/5/31 8:57:58 |
1楼: |
看到這篇特地登入上來留言 先講我最後的方式是 改用golang開發
delphi 支援度太低了 看QC 官方也表示尚未完整支援 還有字串轉換也很有問題 我自己測試 使用TPath.GetDocumentPath 就會錯誤閃退(已有加上權限)
現在用golang開發 支援度高沒話說 編譯速度也快
如果還是想要用delphi開發的話 可看這篇 http://bbs.2ccc.com/topic.asp?topicid=628267
----------------------------------------------
-
|
作者: |
|
2023/6/1 8:54:44 |
2楼: |
delphi 倒是可以生成 android 下的 .so 文件,但是基本处于不可用状态,不支持 class constructor 的特性,导致很多基础库都有问题
我之前有个小项目就是需要编译一个 android 下的 .so 动态库,折腾了好久才发现前面的问题,我已经向官方提交了这个bug,也已经被官方确认了,就不知道什么时候会修正了。
后来我换 free pascal 暂时解决了这个问题,你不妨试试。
----------------------------------------------
-
|
作者: |
hfade (hfade) |
★☆☆☆☆ |
-
|
普通会员 |
|
2023/6/9 14:04:11 |
3楼: |
我在delphi 11.3测试了,android下做so基本不可用。http://bbs.2ccc.com/topic.asp?topicid=628267这个帖子只说了表面的事。 既然有人提这个问题,我就简要说一下:
delphi对android的支持本质上是利用动态链接库实现的,Delphi编译的apk,你的pascal代码都被包含在一个so中,比如lib/armeabi/libHrTracerTest.so, delphi用apk的class.dex中的java代码加载so,调用so中的_NativeMain函数初始化delphi相关的运行环境,再让你的代码在android运行起来。_NativeMain 中,一开始调SysInit.pas中的_InitExe函数,然后还会执行一系列的初始化工作。
如http://bbs.2ccc.com/topic.asp?topicid=628267帖子里说的,产生so可以有两种方式:program 和 library; 这两者的区别如下: 1、用program,这种方式产生的so同Delphi常规apk产生的so一样,delphi初始化的过程包含在so的引出函数_NativeMain中,我们加载so,不会去调用_NativeMain,所以这种方式编写的so许多基本的delphi机制都不能用,因为Delphi的基本初始化都没有做。 2、用library,这种方式产生的so没有_NativeMain函数,Delphi的初始化代码放在so的ELF的初始化段.init_array中(program方式产生的so没有.init_array段),实际执行的就是system.pas 中的initialization, .init_array在so加载时操作系统会自动执行它,但是不幸的是,这里有bug,执行到GetAndroidLocaleNameJNI时,因为 System.JavaMachine为nil,所以出现异常, 所以delphi的android so机制就是不可用的。
总结看就是到目前为止 delphi 11.3(其它版本我没测过) 的so机制在android下不可用。如果要用,可以尝试android service的方式,我在试,还不知道有什么坑。
----------------------------------------------
-
|
作者: |
hfade (hfade) |
★☆☆☆☆ |
-
|
普通会员 |
|
2023/6/14 11:01:12 |
4楼: |
我测了一下android service方式,发现如果包含fmx相关的单元,服务加载会异常,delphi自带的几个例子是没问题的。android service本质上也是用program定义的so。鉴于这个情况,我怀疑不是program和library定义的问题,而是要看so包含了哪些单元。本来只想搞个android下的小功能,就为so加载的问题越整越复杂。既然花了百倍的时间,还是要把问题搞清楚,所以计划返回去调试library方式定义的so,有结果再报告。我用的版本是lsuper大神的28.0.47991.2819,还么时间换28.0.48361.3236,官方说3236版本对android调试有改进,不知道解决so加载这些问题没?
----------------------------------------------
-
|
作者: |
hfade (hfade) |
★☆☆☆☆ |
-
|
普通会员 |
|
2023/6/14 12:15:10 |
5楼: |
试了一下,library方式不行,这个方式so的初始化走的是_StartLib而program方式是_StartExe,执行到sysytem.pas的initialization就异常了。原因是Android.inc的146行中引用的System.JavaMachine为nil。看来只能用android service方式了。
----------------------------------------------
-
|
作者: |
hs_kill (lzl_17948876) |
★☆☆☆☆ |
-
|
普通会员 |
|
2023/6/14 13:34:10 |
6楼: |
如果用program方式编译出so 外部手动调用_NativeMain执行初始化呢
----------------------------------------------
http://www.cnblogs.com/lzl_17948876/
|
作者: |
hfade (hfade) |
★☆☆☆☆ |
-
|
普通会员 |
|
2023/6/14 14:33:24 |
7楼: |
用program方式编译出so,外部手动调用_NativeMain执行初始化,可能同android service的效果一样,还需要试试。
刚试了,手工调用不行,还是System.JavaMachine为空。
----------------------------------------------
-
|
作者: |
hs_kill (lzl_17948876) |
★☆☆☆☆ |
-
|
普通会员 |
|
2023/6/14 18:15:47 |
8楼: |
-_-.....等官方修复吧
----------------------------------------------
http://www.cnblogs.com/lzl_17948876/
|
作者: |
|
2023/6/14 22:06:52 |
9楼: |
使用lazarus吧,lazarus原生支持android,基本上除了平台相关外,delphi代码全部可以搬过来,生成so没问题。 因为lazarus跨平台机制与delphi在理念上是完全不一样的,lazarus的理念是一次编写到处编译,没有delphi这种定制化的限定。 你看delphi的android低层平台基本上都是一些java库、接口再加上一层pascal外衣,有点当初c++builder使用vcl在pascal库套一个C++外衣的味道。delphi在linux x86的的跨平台在实现机制上也很有问题。lazarus源于delphi优于delphi,lazarus的理念是摒弃delphi这种权宜之计跨平台的思路,它的原理是不建立在一个具体平台之上,特别是不依赖win\intel,free pascal 组件库LCL可以编译为win\linux\ios\andriod\Mac Os,哪一个系统要接入lazarus体系,需要从底层就要与free pascal做好匹配。例如,要lazarus匹配loongarch不是一个很复杂的工程,因为基本不需要改变lazarus的体系,而delphi要匹配loongarch几乎是不可能的,因为龙芯中科是论再努力也做不到,而lazarus,只要龙芯想匹配,free pascal\lazarus大门永远是敞开的,loongarch如此,risc-v如此,zhaoxing也是如此。
----------------------------------------------
-
|
作者: |
hfade (hfade) |
★☆☆☆☆ |
-
|
普通会员 |
|
2023/6/15 10:01:27 |
10楼: |
谢谢建议,我找lazarus试试。
----------------------------------------------
-
|
|