Ich habe eine App auf Android mit Delphi XE6 erstellt, die C-Code erfordert. Unter iOS kann ich es jedoch nicht zum Laufen bringen. Ich vermute, dass das Problem mit dem Arm-/Daumenstatus zusammenhängt, bin mir aber nicht sicher. Es gibt in beiden Systemen kein Problem, den C-Code von Pascal aus aufzurufen. Aber wenn der C-Code eine Pascal-Prozedur zurückruft, generiert iOS eine "bad system call (12)"
Hier ist der Pascal-Code:
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;
Und hier ist der C-Code:
extern int BackToPascal(int a,int b);
extern int testarm(int a,int b)
{
int i;
i = BackToPascal(a,b);
return i+1;
}
Auf Android kompiliere ich so (es funktioniert):
..."arm-linux-androideabi-gcc.exe" -c test.c -o test.o -O3 -mfloat-abi=softfp -mfpu=neon -marm -march=armv7-a -mtune=cortex-a8
Auf ios:
xcrun -sdk iphoneos clang -c -arch armv7 test.c -O3 -mfpu=neon -mtune=cortex-a8 -marm -march=armv7-a -mfloat-abi=softfp
Ich vermute, dass meine xcode-Einstellungen falsch sind, aber ich kann nicht herausfinden, warum.
Wenn ich debugge, kommt der Fehler beim Aufruf testC
in testarm
beim Anrufen BackToPascal
( auf “bl 0x8b8390 Xgobj.BackToPascal (int, int)” ). Auf Android funktioniert es hingegen einwandfrei bl
ruft nicht direkt an BackToPascal
aber der folgende Code:
75A82D94 12C68FE2 add r12, pc, #18874368 ; 0x1200000
75A82D98 73CA8CE2 add r12, r12, #471040 ; 0x73000
75A82D9C 40F2BCE5 ldr pc, [r12, #576]! ; 0x240
Welche hineinkommen BackToPascal
Es wird in ähnlichen Threads darüber gesprochen, dass statische Funktionen ein Problem darstellen und das Entfernen von statischen Funktionen geholfen hat. Nicht genug Code, um in Ihrem Fall zu sehen, ob dies der Fall ist. hth
– Koboldhack
26. August 2014 um 13:24 Uhr
iOS ist 64-Bit, kompiliert die Pascal-Schnittstelle mit den Int-Werten zu Plattform-Ints? Ich hatte viele Probleme, als ich zu 64-Bit wechselte, da wir jede Menge Code mit Tonnen von “int” darin geerbt hatten. Wir mussten sie durch NSInteger ersetzen, damit die Anwendung unter 64-Bit ordnungsgemäß funktioniert.
– thst
29. März 2015 um 19:42 Uhr
Zum Zeitpunkt dieser Frage hatte Embarcadero veröffentlicht Delphi XE8. Hast du das neueste Delphi ausprobiert?
– SwiftArchitect
9. Juli 2015 um 5:09 Uhr
Ist es möglich, ein Problem der Anrufkonvention zu sein Verknüpfung (versuchen Sie Pascal zu “extern int BackToPascal(int a,int b);” hinzuzufügen)?
– Shane Lu
31. Juli 2015 um 7:35 Uhr