寄存器的类型为 Long(High Half)但预期为 Long(Low Half)

register has type Long (High Half) but expected Long (Low Half)

我正在尝试解决在 Forward/Rewind 远程按钮按下事件中调用的 Media Player seekTo() 方法的问题,但出现此错误:

使用以下编辑的 smali 尝试将 long 参数转换为 int:

.method private static synthetic a(JLandroid/media/MediaPlayer;)V
    .locals 1

    long-to-int v0, p1
    .line 317
    invoke-virtual {p2, v0}, Landroid/media/MediaPlayer;->seekTo(I)V

    return-void
.end method

我该如何修复这个错误,或者有没有其他方法让它起作用?

这是原始代码(但当我按前进或后退时它只是 stops/pauses 视频):

long-to-int p1, p0
.line 317
invoke-virtual {p2, p1}, Landroid/media/MediaPlayer;->seekTo(I)V

我的临时修复是这样的:

.method private static synthetic a(JLandroid/media/MediaPlayer;)V
    .locals 3

#get current position
invoke-virtual {p2}, Landroid/media/MediaPlayer;->getCurrentPosition()I
move-result v0

#add some ms to current position register
const/16 v1, 0x6978
add-int v2,v0,v1
add-int v2,v2,v1
add-int v2,v2,v1
add-int v2,v2,v1
add-int v2,v2,v1

#seek to calculated position
    .line 317
    invoke-virtual {p2, v2}, Landroid/media/MediaPlayer;->seekTo(I)V
    return-void
.end method

但即使我按倒带它也只寻找前进(因为我只在当前位置添加时间)。
我无法 find/create 为 Rewind 事件自定义方法,源代码非常大且混淆。
跟踪错误链和方法调用链并没有把我带到任何地方。

由于这是一个静态方法,因此没有隐式 "this" 参数,参数寄存器从 p0 开始。所以第一个长参数是p0,p1MediaPlayer参数是p2.

对于 long-to-int 指令(以及大多数使用长值的指令),您可以通过传递宽寄存器对中的第一个寄存器来指定要处理的宽值。在这种情况下,即 p0,而不是 p1

错误是指您传递的是宽寄存器对的上半部分,而不是下半部分。

所以,long-to-int v0, p0可能就是你想要的。