DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: 1djhgfjs
今日帖子: 14
在线用户: 16
导航: 论坛 -> 移动应用开发 斑竹:flyers,iamdream  
作者:
男 dorry (littlecat) ★☆☆☆☆ -
盒子活跃会员
2023/5/31 8:32:36
标题:
delphi11怎样 编译生成 android 下使用的动态库? 浏览:1327
加入我的收藏
楼主: 如题,delphi11 可以编译 android下使用的 .so 动态库吗?
----------------------------------------------
泱泱华夏十亿兵,国耻期待儿孙平,愿提十万虎狼旅,跃马扬刀灭东京!
作者:
男 whesss (whesss) ▲▲▲▲△ -
普通会员
2023/5/31 8:57:58
1楼: 看到這篇特地登入上來留言
先講我最後的方式是 改用golang開發

delphi 支援度太低了 看QC 官方也表示尚未完整支援
還有字串轉換也很有問題
我自己測試 使用TPath.GetDocumentPath 就會錯誤閃退(已有加上權限)

現在用golang開發 支援度高沒話說 編譯速度也快

如果還是想要用delphi開發的話 可看這篇
http://bbs.2ccc.com/topic.asp?topicid=628267
----------------------------------------------
-
作者:
男 souledge (souledge) ★☆☆☆☆ -
普通会员
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/
作者:
男 sxqwhxq (步惊云) ★☆☆☆☆ -
普通会员
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试试。
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行66.40625毫秒 RSS