java - 转换为 Dalvik 失败 - 某处未初始化的变量

标签 java android jvm dalvik jasmin

我正在尝试将我的 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 没有。

关于java - 转换为 Dalvik 失败 - 某处未初始化的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12431691/

相关文章:

java - JVM——新生代和老年代的比例/分配

JVM HotSpot 上的 Java 异常计数器

java - 在java中设置两个数组彼此相等

java - JFileChooser 不显示

java - Android Pie 9.0 的 isNetworkConnected() 问题

android - TWRP 不断崩溃并重新启动

android - MaterialButton 和简单的 Button 有什么区别吗?

java - 延迟播放音频

java - 使用 POJO 类作为 mongodb 的模式,专门处理模式更改

android - 底部栏顶部的 float 操作按钮