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

JNI—从C+;调用Java方法时如何修改参数+;?,java,java-native-interface,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", "(Lj

我有一个类似这样的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方法“返回”一个布尔值。我知道内置布尔值不能用于此目的。是否可以使用布尔包装器实现这一点?如何构造要传递的对象来代替“?”


我在谷歌上搜索了一下,但仍然有一些问题。例如,我想我可以传递一个通过调用Boolean的“方法”创建的对象。但是JavaReadBoolMake值中的赋值不就是指一个新创建的包装器,丢弃第一个对象吗?如果那样的话,我就什么都不需要了。我认为应该可以(在本机代码中)创建Java视为空对象且类型为布尔的对象。可能吗?还是我完全走错了路?

布尔值在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
}
这样调用方就不必使用像
newboolean[]{}
这样的东西


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

布尔值是不可变的-这是否意味着当布尔值作为参数传递时,该方法无法更改它?我设想Value(ReadBool的参数)是一个引用,ReadBool中的赋值将构造一个新的布尔值,然后Value将引用该值。不是这样吗?(很抱歉问这些基本的问题,但我对Java是新手;-)是的,您对immutable的解释是正确的。最好总是使用不可变类(不管怎样,只要可能)并使用结果的返回值。如果你有多个相关的返回值,那么为它们创建一个对象——如果你有多个不相关的返回值,那么让你的方法更具体;我按照如下方式验证它:void TestCall(booleanb){b=false;},然后调用booleanbtest=true;测试呼叫(bTest);b的值实际上在TestCall中被修改,我知道正在创建一个新的布尔值,然后b引用它。但是为什么bTest仍然是真的?b和bTest不是指同一个布尔值吗?Java中的所有内容都是按值传递的-只需搜索ca.300个问题中的一个就可以了(这个问题似乎至少一个月问一次),如果你对此有疑问:)好吧,是的,对b的引用是按值复制的,那么b和bTest不是指同一个布尔值吗?那么,在给b分配了一个新的布尔值之后,为什么b和bTest没有相同的值呢?