java - 如何在 ASM 中编写 native 代码

标签 java java-native-interface java-bytecode-asm

我是一个狂热的 ASM 作家。我正在尝试用 asm 编写 native java 代码。 我遇到的问题是从 Java 传递的参数似乎没有被 asm 代码接收。 C++ 代码似乎使用 Windows 64 位调用约定接收参数,即 rcx、rdx、r8、r9、stack,最初我认为它与 asm 相同,但似乎并非如此。我花了很多时间寻找可能的解释和例子,但还没有找到任何东西,所以我想我会问。我将非常感谢一些帮助来确定我哪里出错了。非常感谢。下面是解释我到目前为止开发的内容的代码片段......

在 NativeInterface.java 中

public native static String test(int _number);

在 Calling.java 中

String s=NativeInterface.test(123);

在 NativeJava.asm 中

.data
dString     db  "This is my string",0
.code
java_test PROC _iNumber:QWORD
 invoke dialog_showMessageInteger,"ASM CODE","Number=",_iNumber
 mov rax,rv(java_createStringUTF8,JNIenv,ADDR dString)
 ret
java_test ENDP

在 asm 中打开的对话框不显示“123”而是“1918844240” 以上代码成功将字符串传递给java。

看来我可以成功地将参数从 asm 传递给 java。 此时我无法将参数从 java 传递给 asm。

我希望使用标准的 Windows 64 位调用约定,但似乎不是这样。我在任何地方都找不到任何文档。有人可以解释一下我在 asm 中应该期待什么吗? 非常非常感谢。

最佳答案

感谢 Peter Cordes,他建议可能传递了一些隐藏的参数,并反汇编了一些 C++ 代码以确保找出答案。

我不需要走那么远。我已经查看了 C++ 代码,我注意到所有 native 例程都将 JNIenv 和 jclass 作为前两个参数。

我修改了我的代码以阅读...

java_test PROC _JNIenv:QWORD,_jclass:QWORD,_iNumber:QWORD

123的值确实给定成功了。

我猜测前两个参数是 JNIenv 和调用类,但考虑到 C++ 函数是如何形成的,我认为这是一个很好的猜测。

感谢您的帮助和支持。 问候 一分钱 保重

关于java - 如何在 ASM 中编写 native 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50086223/

相关文章:

java - 如何使用流修改 List 内的元素并忽略最后一个元素?

java - 如何启用Intellij功能以在垂直滚动条中显示错误

java - 从 Java SDK 运行 Amazon EMR 作业

java - ASM 方法访问者可以与接口(interface)一起使用吗?

java - 推荐的字节码操作库,用于重写类文件以更改类型 e。 G。领域?

java - Java中的字节码分析

Java程序打印x和y坐标图并显示绘制点

java - 安卓NDK。未找到原生 Lcom 的实现

android - 从 java 传递给 jni 的参数返回奇怪的值

java - JNI 返回随机整数