加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Delphi XE6链接C代码在iOS中

发布时间:2020-12-15 05:26:03 所属栏目:大数据 来源:网络整理
导读:我在Android上使用Delphi XE6需要C代码构建了一个应用程序。但是在iOS上我不能使它工作。我怀疑问题是与手臂/拇指状态有关,但我不知道。在任何一个系统中都没有问题从Pascal调用C代码。但是如果C代码调用一个Pascal过程,iOS生成一个“坏的系统调用(12)”
我在Android上使用Delphi XE6需要C代码构建了一个应用程序。但是在iOS上我不能使它工作。我怀疑问题是与手臂/拇指状态有关,但我不知道。在任何一个系统中都没有问题从Pascal调用C代码。但是如果C代码调用一个Pascal过程,iOS生成一个“坏的系统调用(12)”

这里是pascal代码:

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设置是错误的,但我不知道为什么。

当我调试,当调用BackToPascal(在“bl 0x8b8390 Xgobj.BackToPascal(int,int)”)时调用testC“test错误。在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

解决方法

代码看起来不错,你的调用约定处理是,我的眼睛,完全正确。

我认为你可能已经遇到一个可能的/传言的bug在苹果的ARM铛,其中调用静态函数(这可能发生在幕后,例如类型转换)从静态函数可能会导致堆栈损坏。你不是直接这样做,但extern函数可以通过一个stub来实现,它调用包含实现的匿名静态函数。

你可以尝试让你的extern函数是一个只调用非静态实现函数的包装器。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读