iOS中的Delphi XE6链接C代码

Posted

技术标签:

【中文标题】iOS中的Delphi XE6链接C代码【英文标题】:Delphi XE6 link C code in iOS 【发布时间】:2014-10-17 14:22:17 【问题描述】:

我使用 Delphi XE6 在 android 上构建了一个需要 C 代码的应用程序。但是在 ios 上我不能让它工作。我怀疑问题与手臂/拇指状态有关,但我不确定。在任一系统中从 Pascal 调用 C 代码都没有问题。但是如果 C 代码回调一个 Pascal 过程 iOS 会生成一个"bad system call (12)"

这是帕斯卡代码:

function testarm(a,b:integer):integer; cdecl; external "testC.o";

Procedure testC;
Begin
  testarm(1,2);
end;

function BackToPascal(a,b:integer): integer; cdecl;
  Begin
  result := a+b;
end;

......

exports
  BackToPascal;

这里是 C 代码:

extern int BackToPascal(int a,int b);

extern int testarm(int a,int b)

   int i;
   i = BackToPascal(a,b);
   return i+1;

在 android 上,这就是我的编译方式(它正在工作):

..."arm-linux-androideabi-gcc.exe" -c test.c -o test.o -O3 -mfloat-abi=softfp -mfpu=neon -marm -march=armv7-a -mtune=cortex-a8

在 iOS 上:

xcrun -sdk iphoneos clang -c -arch armv7 test.c -O3 -mfpu=neon -mtune=cortex-a8 -marm -march=armv7-a -mfloat-abi=softfp

我怀疑我的 xcode 设置有误,但我不知道为什么。

当我调试时,在调用testarm 时调用testC 时出现错误@ 987654329@ ( on "bl 0x8b8390 Xgobj.BackToPascal (int, int)" )。在 Android 上它可以完美运行,但是 bl 不直接调用 BackToPascal,而是以下代码:

75A82D94 12C68FE2         add r12, pc, #18874368 ; 0x1200000
75A82D98 73CA8CE2         add r12, r12, #471040 ; 0x73000
75A82D9C 40F2BCE5         ldr pc, [r12, #576]! ; 0x240

进入BackToPascal

【问题讨论】:

有一些关于静态函数的类似线程是一个问题并且取出静态函数的讨论。如果是这样,没有足够的代码来查看您的情况。 hth iOS 是 64 位的,带有 int 值的 pascal 接口是否编译为平台 int?我在使用 64 位时遇到了很多问题,因为我们继承了大量代码,里面有大量的“int”。我们必须用 NSInteger 替换它们,以使应用程序在 64 位上正常工作。 在提出这个问题的时候,Embarcadero 已经发布了 Delphi XE8。你试过最新的 Delphi 吗? 是否有可能是调用约定link的问题(尝试将pascal添加到“extern int BackToPascal(int a,int b);”)? 【参考方案1】:

代码看起来很正确,而且在我看来,您的调用约定处理是完全正确的。

我认为您可能在 Apple 的 ARM clang 中遇到了一个可能/传闻的错误,其中从静态函数调用静态函数(可能在后台发生,例如用于类型转换)可能会导致堆栈损坏。您不是直接这样做,但外部函数可以通过调用包含实现的匿名静态函数的存根来实现。

您可以尝试让您的 extern 函数成为一个仅调用非静态实现函数的包装器。

【讨论】:

以上是关于iOS中的Delphi XE6链接C代码的主要内容,如果未能解决你的问题,请参考以下文章

修改delphi xe6 FMX Label字体颜色

Delphi XE6 Android拨号函数

Delphi XE6 Firemonkey Mobile - 如何禁用虚拟键盘?

有没有人有 Delphi XE6 中 JSON 往返序列化的示例? [关闭]

Delphi XE6 编译出的exe程序,体积很大怎么弄

Delphi中的按位补码。 (翻译C#〜运算符)