我已经在Android上使用需要C代码的Delphi XE6构建了一个应用程序。但是在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设置错误,但是我不知道为什么。
当我调试,错误时调用来testC
在testarm
调用时BackToPascal
(在“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