我正在尝试将我的Android应用程序与使用Free Pascal编译的JAR链接.我收到以下构建错误:
[2012-09-14 16:08:38 - MyApp] Dx
EXCEPTION FROM SIMULATION:
[2012-09-14 16:08:38 - MyApp] Dx local 0009: invalid
[2012-09-14 16:08:38 - Yarxi] Dx ...at bytecode offset 00015f2c
locals[0000]: Lcom/mypackage/$Core$$_fpc_nestedvars$70;
locals[0001]: I
locals[0002]: I
locals[0003]: I
locals[0004]: I
locals[0005]: I
locals[0006]: I
locals[0007]: I
locals[0008]: I
locals[0009]: <invalid>
locals[000a]: <invalid>
(..more locals... much more)
locals[06db]: <invalid>
stack[0003]: I
stack[0002]: I
stack[0001]: [I
stack[top0]: int{0x00000000 / 0}
...while working on block 5f23
...while working on method $MyMethod$944$FPR1:(Lcom/mypackage/$Core$$_fpc_nestedvars$70;)V
...while processing $MyMethod$944$FPR1 (Lcom/mypackage/$Core$$_fpc_nestedvars$70;)V
...while processing com/mypackage/Core.class
[2012-09-14 16:08:40 - MyApp] Dx 1 error; aborting
[2012-09-14 16:08:40 - MyApp] Conversion to Dalvik format failed with error 1
错误似乎是在某些时候,代码尝试读取未初始化的本地0009.
现在,Pascal不再强制执行局部变量的初始化.有可能,初始化首先被省略了.我保留了Free Pascal为我生成的JVM程序集文件.那些与Jasmin一起组装到类文件中.该文件很大-我不在这里粘贴.
有人可以帮我追溯错误的根源吗?错误发生在字节码偏移量00015f2c处.有没有办法将其转换回装配文件行号?
解决方法:
解决.实际上,00015f2c(十进制为89900)是方法中的字节码偏移量.我做了以下.
首先,我直接调用Jasmin,传递生成的.j文件和-g选项(生成行号):
java -jar %JASM% -g Core.j
Free Pascal本身不会发出-g.这给了我另一个Core.class文件,其中包含行号,行号相对于FPC生成的.j文件.然后,我使用javap将类反汇编为另一个.j文件:
"%JDKROOT%\javap" -l -c Core.class >Core_WithLines.j
但是,这个新的.j文件包含每个单独命令的行号和偏移量.然后,我在令人反感的方法中搜索了偏移量89900(注意:偏移量,由javap生成,在65536处换行).然后,我查看了该方法的主体下面的LineNumberTable(偏移量和行号都包含在内),在源Core.j文件中找到了与此偏移量相对应的行号.回头看一下Core.j,有一条注释包含Pascal源代码的行号.
确实有一个函数调用传递了一个未初始化的变量-但作为var参数.
该问题是Pascal / JVM边界问题.该变量尚未初始化,但已由ref传递到要从后者返回的函数中.编译器应该以某种方式将其抽象出来,恕我直言,但FPC没有.