java - JNI - 从 C++ 调用 Java 方法时如何修改参数?

标签 java java-native-interface

我有一个类似这样的 Java 方法

public boolean ReadBool(String ValueName, Boolean Value)  
{  
  boolean Retval = ...;  
  ...  
  Value = true;  
  ...  
  return bRetval;  
}

我从 native 代码 (C++) 调用,如下所示:

jMethodID MethodId = pEnv->GetMethodID(ClassId, "ReadBool", "(Ljava/lang/String;Ljava/lang/Boolean;)Z");  
// What goes instead of "??" ?  
bool bOk = pEnv->CallBooleanMethod(myobject, MethodId, pEnv->NewStringUTF("Value1"), "??");

我的目的是让 Java 方法在 Value 中“返回”一个 boolean 值。我知道内置 boolean 值无法用于此目的。是否可以使用 boolean 包装器来做到这一点?如何构造要传递的对象来代替“??” ?

我已经用谷歌搜索过,但仍然存在一些问题。例如,我想我可以传递通过调用 Boolean 的 “方法”创建的对象。但是 Java ReadBool 中的赋值不会使 Value 引用新创建的包装器,从而丢弃第一个对象吗?在这种情况下,我会毫无意义地调用 。我认为应该可以(在 native 代码中)创建一些 Java 视为 null 且类型为 Boolean 的对象。那可能吗?或者我完全走错了路?

最佳答案

boolean 值在 Java 中是不可变的,因此您需要自己的包装类,但它可能非常简单:

public class BooleanWrapper {
    public boolean val;
    // public is fine here imo, but you can obviously use [g|s]etters as well
}

或者,如果您不想要这个,我们可以使用..虽然不是很漂亮,但很高兴知道黑客:

public void hack(boolean[] vals) {
    vals[0] = true; // voila, now you change the value itself
}

调用时有一些明显的缺点(并且看起来很奇怪),但如果您愿意保留特定的参数序列,您可以这样做:

public void hack(boolean.. vals) {
    vals[0] = true; // voila, now you change the value itself
}

这样调用者就不必使用诸如 new boolean[] {}; 之类的东西

您显然可以欺骗并更改 boolean 对象本身的内部状态,但这会产生不需要的后果(如果您在内部将 Boolean.TRUE 实例更改为 false,则 boolean 值会被缓存,这将产生有趣的结果)。所以不要这样做。

关于java - JNI - 从 C++ 调用 Java 方法时如何修改参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7797928/

相关文章:

java - 如何为 javax.swing.JTable() 重新定义 VerticalTableHeaderCellRenderer() 以垂直写入文本

java - hibernate 查询 : positioned parameter and named parameter

android-studio - 在Android Studio上使用ARM64-v8a的汇编语言

java - 什么是 xdoclet? (从C程序员的角度来看)

java - JNI 代码中的 LD_PRELOAD 变量

java - 我应该使用哪个进行 iOS 开发,C 库还是 Java 版本?

java - "No Suitable Driver"基本 java derby DB 读取错误

java - Lambda 表达式如何转换成 Java 字节码

java - 可定制的@Autowired

java - jni xlib 窗口句柄