我有一个像这样的Java方法
public boolean ReadBool(String ValueName, Boolean Value)
{
boolean Retval = ...;
...
Value = true;
...
return bRetval;
}
我从本机代码(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中“返回”一个布尔值。我知道内置布尔值不能用于此目的。是否可以使用布尔包装器执行此操作?如何构造对象来代替“??” ?
我用Google搜索过,但仍有一些问题。例如,我想我可以传递一个通过调用Boolean的< init>创建的对象。 “方法”。但是,Java ReadBool中的赋值不会使Value引用一个新创建的包装器,抛弃第一个对象吗?在那种情况下,我会调用< init>徒劳无功。我认为应该可以创建(在本机代码中)Java看到的一个null为null的对象,其类型为Boolean。那可能吗?或者我完全走错了轨道?
答案 0 :(得分:2)
布尔值在Java中是不可变的,所以你需要自己的包装类,但这可以非常简单:
public class BooleanWrapper {
public boolean val;
// public is fine here imo, but you can obviously use [g|s]etters as well
}
或者,如果你不想要这个,我们可以使用..好吧不是很漂亮,但很高兴知道hack:
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.TRUE实例更改为false,那么布尔值会被缓存,这会产生有趣的结果)。所以不要这样做。