【问题标题】:How JNI takes the returned value-object of native methodJNI如何获取native方法的返回值对象
【发布时间】:2018-01-03 02:57:20
【问题描述】:

我的问题是 JNI 如何获取本机方法的返回值并将其提供给 JVM(推入本机堆栈)。

例如,如果我有一个本机方法toString,并且JVM 知道toString 方法的代码在哪里,那么JNI 如何调用该方法?

【问题讨论】:

  • WTF? JNI 调用的返回值与“system()”的返回值有什么关系。除了“返回???”这个词另见:JNI String return value
  • 是的,我同意你的观点,但我的问题是如何调用本机方法,然后如何获取返回值。如果你想要一个不同的问题但同样的事情:如何使用 C++ 从另一个文件中调用一个函数并从中获取返回值。(没有序列化)
  • @paulsm4 我想知道这个虚拟机是如何工作的,不知道如何将一个字符数组转换为java字符串。
  • 建议:在 ONE 平台上研究 ONE 语言的“传递返回值”的 ONE 方法。了解它是如何工作的。然后通过与某些 DIFFERENT 平台和语言(例如 Java JNI)上的某些 DIFFERENT“返回值”进行比较来应用这种理解。关于 C++ 函数调用的好文章:x86 calling conventions

标签: java jvm java-native-interface


【解决方案1】:

Java 不接收来自本地方法的 C 样式字符数组。被调用者构建一个 Java 对象(例如,字符串)并通过引用将其传递给调用者。使用 primitive 类型,例如int,结果是传值,但实现细节是JVM私有的。

【讨论】:

    【解决方案2】:

    Java 仅支持原语和引用。没有传递或返回 String 对象类型,只有每个 reference 到 String。从 C 的角度来看,此引用是 void *,并且不会对对象中的数据进行转换。

    我想知道这个虚拟机是如何工作的,不知道如何将字符数组转换为 java 字符串

    Convert char* to jstring in JNI, when char* is passed using va_arg

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-20
      • 1970-01-01
      • 1970-01-01
      • 2019-03-07
      • 1970-01-01
      相关资源
      最近更新 更多