Я создал приложение на Android с помощью Delphi XE6, для которого требуется код C. Однако на iOS я не могу заставить его работать. Я подозреваю, что проблема связана с состоянием руки/пальца, но я не уверен. В любой системе нет проблем вызывать код C из Pascal. Но если код 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;
}
В андроиде это то, как я компилирую (он работает):
..."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