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

时间:2011-10-17 18:27:53

标签: java java-native-interface

我有一个像这样的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。那可能吗?或者我完全走错了轨道?

1 个答案:

答案 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,那么布尔值会被缓存,这会产生有趣的结果)。所以不要这样做。