【问题标题】:JNI Method Call with multple different arguments具有多个不同参数的 JNI 方法调用
【发布时间】:2017-09-06 23:11:03
【问题描述】:

我的问题是 lArgs 应该如何被格式化?我在任何地方都找不到任何 args 是不同对象列表的示例。

我尝试将 lArgs 设为对象数组,但没有成功,我猜是因为对象数组不是字节数组和两个字符串。

请帮忙谢谢。

szMethod            db "externalCallIn",0
szMethodArgs        db "([BLjava/lang/String;Ljava/lang/String;)V",0


invoke JNI_GetStaticMethodID,dJNIenv,lClass,ADDR szMethod,ADDR szMethodArgs
mov  lMethod,eax

invoke JNI_CallStaticVoidMethod,dJNIenv,lClass,lMethod,lArgs

以下不起作用...

LOCAL lClass:DWORD
LOCAL lMethod:DWORD
LOCAL lByteArray:DWORD
LOCAL lString1:DWORD
LOCAL lString2:DWORD

invoke JNI_CallStaticVoidMethod,dJNIenv,lClass,lMethod,lByteArr,lSt‌​r1,lStr2

JNI_CallStaticVoidMethod PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD

JNI_CallStaticVoidMethod PROC inJNIenv:DWORD, inClass:DWORD, inMethod:DWORD, inByteArr:DWORD,‌ ​inStr1:DWORD, inStr2:‌​DWORD
push inStr2
push inStr1
push inByteArr
push inMethod
push inClass
push inJNIenv
mov eax,inJNIenv
mov eax,[eax]
call DWORD PTR [eax].JNIenv.CallStaticVoidMethod
ret
JNI_CallStaticVoidMethod ENDP

如果我只有 1 个参数,它可以正常工作。我找不到任何显示如何拥有多个不同参数的示例。非常感谢一个例子。

这是java类...

public class MyClass
 {
 public static void externalCallIn(byte[] _bytes,String _s1,String _s2)
  {
  ...
  }
 } 

【问题讨论】:

  • CallStaticVoidMethod 接受可变数量的参数,因此您的原型应该类似于JNI_CallStaticVoidMethod PROTO C :DWORD,:VARARG,然后您需要在调用它时提供正确数量的参数。如果您打算使用CallStaticVoidMethodA,您需要创建一个jvalues 数组并将其地址传递给CallStaticVoidMethodA。这似乎比仅仅使用CallStaticVoidMethodIMO 更有效。
  • 感谢您的回复。你是对的,但我没有很好地问这个问题。请注意更改谢谢:)

标签: methods java-native-interface call


【解决方案1】:

我发布的代码没有任何问题。 在我将字节数组放在一起的过程代码中,我没有在 eax 中返回结构指针。犯一个愚蠢的错误。 一旦我纠正了这一点,一切都会按预期工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多