我有一个类似这样的 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 的
最佳答案
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/