Hello together!As you might have noticed I'm currently trying to get Pascal code working on Android using the new JVM backend.
So far I've converted the Android API in the android namespace to Pascal and managed to compile, convert (to DEX) and package a full Pascal HelloWorld application, but when started on the emulator I get the message that the application stopped working (log will be shown further down). After some non successful tries I decided to use the Java HelloWorld application outlined on http://developer.android.com/resources/tutorials/hello-world.html#ui (I used this as an example for the full FPC one as well) and replace the string constant by a call to a FPC class. So I added a TTestClass derived from TObject with a method getText that returns a UnicodeString. After providing the RTL class files to the build system I invoked "ant debug" and were greeted with error messages when it tried to convert TObject.class and tmethod.class to Dalvik code (log will be posted below). To be sure I decided to replace TObject by JLObject, I built successfully and sent the package to the emulator. And look at the screenshot, I got presented by my choosen text :D
So it is definitely possible to run FPC JVM code on Dalvik, it's just not working perfectly currently...
Here are the logs: When running the full FPC application (or "activity"): === begin run log ===I/ActivityManager( 59): Start proc org.freepascal.helloworld for activity org.freepascal.helloworld/.THelloWorld: pid=601 uid=10035 gids={1015}
D/dalvikvm( 601): newInstance failed: p0 i0 [0 a1 D/AndroidRuntime( 601): Shutting down VMW/dalvikvm( 601): threadid=1: thread exiting with uncaught exception (group=0x40015560)
E/AndroidRuntime( 601): FATAL EXCEPTION: mainE/AndroidRuntime( 601): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{org.freepascal.helloworld/org.freepascal.helloworld.THelloWorld}: java.lang.InstantiationException: org.freepascal.helloworld.THelloWorld E/AndroidRuntime( 601): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1569) E/AndroidRuntime( 601): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663) E/AndroidRuntime( 601): at android.app.ActivityThread.access$1500(ActivityThread.java:117) E/AndroidRuntime( 601): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931) E/AndroidRuntime( 601): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 601): at android.os.Looper.loop(Looper.java:123)E/AndroidRuntime( 601): at android.app.ActivityThread.main(ActivityThread.java:3683) E/AndroidRuntime( 601): at java.lang.reflect.Method.invokeNative(Native Method) E/AndroidRuntime( 601): at java.lang.reflect.Method.invoke(Method.java:507) E/AndroidRuntime( 601): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) E/AndroidRuntime( 601): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
E/AndroidRuntime( 601): at dalvik.system.NativeStart.main(Native Method)E/AndroidRuntime( 601): Caused by: java.lang.InstantiationException: org.freepascal.helloworld.THelloWorld
E/AndroidRuntime( 601): at java.lang.Class.newInstanceImpl(Native Method) E/AndroidRuntime( 601): at java.lang.Class.newInstance(Class.java:1409)E/AndroidRuntime( 601): at android.app.Instrumentation.newActivity(Instrumentation.java:1021) E/AndroidRuntime( 601): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1561)
E/AndroidRuntime( 601): ... 11 moreW/ActivityManager( 59): Force finishing activity org.freepascal.helloworld/.THelloWorld W/ActivityManager( 59): Activity pause timeout for HistoryRecord{406869e8 org.freepascal.helloworld/.THelloWorld}
=== end run log ===And here the log entry when building the Java based example with a class that derives from TObject:
=== begin build log ===[echo] Converting compiled files and external libraries into /home/sven/projects/android/helloandroid/bin/classes.dex...
[apply] [apply] UNEXPECTED TOP-LEVEL EXCEPTION:[apply] com.android.dx.cf.code.SimException: local variable type mismatch: attempt to set or access a value of type java.lang.Object using a local variable of type boolean. This is symptomatic of .class transformation tools that ignore local variable information. [apply] at com.android.dx.cf.code.BaseMachine.throwLocalMismatch(BaseMachine.java:550) [apply] at com.android.dx.cf.code.Simulator$SimVisitor.visitLocal(Simulator.java:570) [apply] at com.android.dx.cf.code.BytecodeArray.parseInstruction(BytecodeArray.java:481) [apply] at com.android.dx.cf.code.Simulator.simulate(Simulator.java:99)
[apply] at com.android.dx.cf.code.Ropper.processBlock(Ropper.java:684) [apply] at com.android.dx.cf.code.Ropper.doit(Ropper.java:639) [apply] at com.android.dx.cf.code.Ropper.convert(Ropper.java:252)[apply] at com.android.dx.dex.cf.CfTranslator.processMethods(CfTranslator.java:252) [apply] at com.android.dx.dex.cf.CfTranslator.translate0(CfTranslator.java:131) [apply] at com.android.dx.dex.cf.CfTranslator.translate(CfTranslator.java:85) [apply] at com.android.dx.command.dexer.Main.processClass(Main.java:369) [apply] at com.android.dx.command.dexer.Main.processFileBytes(Main.java:346)
[apply] at com.android.dx.command.dexer.Main.access$400(Main.java:59)[apply] at com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:294) [apply] at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:134) [apply] at com.android.dx.cf.direct.ClassPathOpener.processDirectory(ClassPathOpener.java:190) [apply] at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:122) [apply] at com.android.dx.cf.direct.ClassPathOpener.processDirectory(ClassPathOpener.java:190) [apply] at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:122) [apply] at com.android.dx.cf.direct.ClassPathOpener.processDirectory(ClassPathOpener.java:190) [apply] at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:122) [apply] at com.android.dx.cf.direct.ClassPathOpener.processDirectory(ClassPathOpener.java:190) [apply] at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:122) [apply] at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:108)
[apply] at com.android.dx.command.dexer.Main.processOne(Main.java:313)[apply] at com.android.dx.command.dexer.Main.processAllFiles(Main.java:233)
[apply] at com.android.dx.command.dexer.Main.run(Main.java:185) [apply] at com.android.dx.command.dexer.Main.main(Main.java:166) [apply] at com.android.dx.command.Main.main(Main.java:90) [apply] ...at bytecode offset 00000005 [apply] locals[0000]: Lorg/freepascal/rtl/FpcBitSet; [apply] locals[0001]: Lorg/freepascal/rtl/FpcBitSet; [apply] locals[0002]: <invalid> [apply] locals[0003]: <invalid> [apply] locals[0004]: <invalid> [apply] locals[0005]: <invalid> [apply] locals[0006]: <invalid> [apply] locals[0007]: <invalid> [apply] stack[top0]: Ljava/lang/Object; [apply] ...while working on block 0005[apply] ...while working on method containsAll:(Lorg/freepascal/rtl/FpcBitSet;)Z [apply] ...while processing containsAll (Lorg/freepascal/rtl/FpcBitSet;)Z
[apply] ...while processing org/freepascal/rtl/FpcBitSet.class [apply] [apply] [apply] trouble processing:[apply] class name (org/freepascal/rtl/TMethod) does not match path (org/freepascal/rtl/tmethod.class)
[apply] ...while parsing org/freepascal/rtl/tmethod.class [apply] ...while processing org/freepascal/rtl/tmethod.class [apply] [apply] UNEXPECTED TOP-LEVEL EXCEPTION:[apply] com.android.dx.cf.code.SimException: local variable type mismatch: attempt to set or access a value of type java.lang.Object using a local variable of type boolean. This is symptomatic of .class transformation tools that ignore local variable information. [apply] at com.android.dx.cf.code.BaseMachine.throwLocalMismatch(BaseMachine.java:550) [apply] at com.android.dx.cf.code.Simulator$SimVisitor.visitLocal(Simulator.java:570) [apply] at com.android.dx.cf.code.BytecodeArray.parseInstruction(BytecodeArray.java:481) [apply] at com.android.dx.cf.code.Simulator.simulate(Simulator.java:99)
[apply] at com.android.dx.cf.code.Ropper.processBlock(Ropper.java:684) [apply] at com.android.dx.cf.code.Ropper.doit(Ropper.java:639) [apply] at com.android.dx.cf.code.Ropper.convert(Ropper.java:252)[apply] at com.android.dx.dex.cf.CfTranslator.processMethods(CfTranslator.java:252) [apply] at com.android.dx.dex.cf.CfTranslator.translate0(CfTranslator.java:131) [apply] at com.android.dx.dex.cf.CfTranslator.translate(CfTranslator.java:85) [apply] at com.android.dx.command.dexer.Main.processClass(Main.java:369) [apply] at com.android.dx.command.dexer.Main.processFileBytes(Main.java:346)
[apply] at com.android.dx.command.dexer.Main.access$400(Main.java:59)[apply] at com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:294) [apply] at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:134) [apply] at com.android.dx.cf.direct.ClassPathOpener.processDirectory(ClassPathOpener.java:190) [apply] at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:122) [apply] at com.android.dx.cf.direct.ClassPathOpener.processDirectory(ClassPathOpener.java:190) [apply] at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:122) [apply] at com.android.dx.cf.direct.ClassPathOpener.processDirectory(ClassPathOpener.java:190) [apply] at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:122) [apply] at com.android.dx.cf.direct.ClassPathOpener.processDirectory(ClassPathOpener.java:190) [apply] at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:122) [apply] at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:108)
[apply] at com.android.dx.command.dexer.Main.processOne(Main.java:313)[apply] at com.android.dx.command.dexer.Main.processAllFiles(Main.java:233)
[apply] at com.android.dx.command.dexer.Main.run(Main.java:185) [apply] at com.android.dx.command.dexer.Main.main(Main.java:166) [apply] at com.android.dx.command.Main.main(Main.java:90) [apply] ...at bytecode offset 00000009 [apply] locals[0000]: Lorg/freepascal/rtl/FpcBaseNestedProcVarType; [apply] locals[0001]: [Ljava/lang/Object; [apply] locals[0002]: <invalid> [apply] locals[0003]: <invalid> [apply] locals[0004]: <invalid> [apply] locals[0005]: <invalid> [apply] locals[0006]: <invalid> [apply] locals[0007]: <invalid> [apply] stack[0001]: Lorg/freepascal/rtl/FpcBaseNestedProcVarType; [apply] stack[top0]: [Ljava/lang/Object; [apply] ...while working on block 0009[apply] ...while working on method invokeBooleanFunc:([Ljava/lang/Object;)Z
[apply] ...while processing invokeBooleanFunc ([Ljava/lang/Object;)Z[apply] ...while processing org/freepascal/rtl/FpcBaseNestedProcVarType.class
[apply] [apply] [apply] UNEXPECTED TOP-LEVEL EXCEPTION:[apply] com.android.dx.cf.code.SimException: local variable type mismatch: attempt to set or access a value of type java.lang.Object using a local variable of type int. This is symptomatic of .class transformation tools that ignore local variable information. [apply] at com.android.dx.cf.code.BaseMachine.throwLocalMismatch(BaseMachine.java:550) [apply] at com.android.dx.cf.code.Simulator$SimVisitor.visitLocal(Simulator.java:570) [apply] at com.android.dx.cf.code.BytecodeArray.parseInstruction(BytecodeArray.java:481) [apply] at com.android.dx.cf.code.Simulator.simulate(Simulator.java:99)
[apply] at com.android.dx.cf.code.Ropper.processBlock(Ropper.java:684) [apply] at com.android.dx.cf.code.Ropper.doit(Ropper.java:639) [apply] at com.android.dx.cf.code.Ropper.convert(Ropper.java:252)[apply] at com.android.dx.dex.cf.CfTranslator.processMethods(CfTranslator.java:252) [apply] at com.android.dx.dex.cf.CfTranslator.translate0(CfTranslator.java:131) [apply] at com.android.dx.dex.cf.CfTranslator.translate(CfTranslator.java:85) [apply] at com.android.dx.command.dexer.Main.processClass(Main.java:369) [apply] at com.android.dx.command.dexer.Main.processFileBytes(Main.java:346)
[apply] at com.android.dx.command.dexer.Main.access$400(Main.java:59)[apply] at com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:294) [apply] at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:134) [apply] at com.android.dx.cf.direct.ClassPathOpener.processDirectory(ClassPathOpener.java:190) [apply] at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:122) [apply] at com.android.dx.cf.direct.ClassPathOpener.processDirectory(ClassPathOpener.java:190) [apply] at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:122) [apply] at com.android.dx.cf.direct.ClassPathOpener.processDirectory(ClassPathOpener.java:190) [apply] at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:122) [apply] at com.android.dx.cf.direct.ClassPathOpener.processDirectory(ClassPathOpener.java:190) [apply] at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:122) [apply] at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:108)
[apply] at com.android.dx.command.dexer.Main.processOne(Main.java:313)[apply] at com.android.dx.command.dexer.Main.processAllFiles(Main.java:233)
[apply] at com.android.dx.command.dexer.Main.run(Main.java:185) [apply] at com.android.dx.command.dexer.Main.main(Main.java:166) [apply] at com.android.dx.command.Main.main(Main.java:90) [apply] ...at bytecode offset 00000010 [apply] locals[0000]: [Ljava/lang/Object; [apply] locals[0001]: [Ljava/lang/Object; [apply] locals[0002]: I [apply] locals[0003]: I [apply] locals[0004]: I [apply] locals[0005]: [Ljava/lang/Object; [apply] locals[0006]: <invalid> [apply] locals[0007]: <invalid> [apply] locals[0008]: <invalid> [apply] locals[0009]: <invalid> [apply] locals[000a]: <invalid> [apply] locals[000b]: <invalid> [apply] locals[000c]: <invalid> [apply] locals[000d]: <invalid> [apply] locals[000e]: <invalid> [apply] locals[000f]: <invalid> [apply] stack[top0]: Ljava/lang/Object; [apply] ...while working on block 0010[apply] ...while working on method fpc_setlength_dynarr_multidim:([Ljava/lang/Object;[Ljava/lang/Object;ZIC)[Ljava/lang/Object; [apply] ...while processing fpc_setlength_dynarr_multidim ([Ljava/lang/Object;[Ljava/lang/Object;ZIC)[Ljava/lang/Object;
[apply] ...while processing org/freepascal/rtl/system.class [apply] [apply] 1 warning [apply] 3 errors; aborting === end build log === Regards, Sven
<<attachment: first-fpc-dalvik.png>>
_______________________________________________ fpc-devel maillist - fpc-devel@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-devel