将Java布尔数组转换为C++;布尔阵列

将Java布尔数组转换为C++;布尔阵列,java,c++,java-native-interface,Java,C++,Java Native Interface,我试图将一个布尔数组从java传递到C++,然后将其转换成布尔数组。但是,不管布尔值是什么,它总是被计算为true,因为该值是一个大于0的数字。我的最新尝试代码是: jint capsLen = env->GetArrayLength(capabilities); if (capsLen <= 0) { print error; return; } bool capsArray[capsLen]; jboolean *getbool = env->GetBoolean

我试图将一个布尔数组从java传递到C++,然后将其转换成布尔数组。但是,不管布尔值是什么,它总是被计算为true,因为该值是一个大于0的数字。我的最新尝试代码是:

jint capsLen = env->GetArrayLength(capabilities);
if (capsLen <= 0)
{
  print error;
  return;
}

bool capsArray[capsLen];
jboolean *getbool = env->GetBooleanArrayElements(capabilities, NULL);
for (int i = 0; i < capsLen; i++)
  capsArray[i] = (bool)getbool[i]

<> P>所以问题不是C++的代码,而是我缺乏java的知识,固执的要求java人帮忙。

我发现我正在构建并传递函数“代码>布尔CAP[]/COD>而不是<代码>布尔帽[]/Cord>.P>什么值实际上被C++程序读取到<代码> GETBOOL ?换句话说,你能在读取后

printf
所有
getbool
的值吗?我确实在考虑使用int。但我也不明白为什么你不能在获得信息后立即根据需要进行int到bool的转换。假设int值是合理的/可解析的。我无法重现这种行为。如果我打印getbool的结果,我会得到1和0,正如预期的那样。通过将它们与JNI_TRUE进行比较,而不是强制转换,我可以安全地将它们复制到布尔数组。我认为您需要显示更多的代码。@AeroBuffalo我的原生代码如下:在Windows 7上使用MinGW/GCC编译。你能用你本机方法的完整源代码更新你的帖子吗?对不起,我现在没有发现你的代码中有任何明显的错误。除了不应该尝试在堆栈上实例化动态大小的数组(capsArray)之外,请使用new和delete操作符。
jboolean getbool[1];
bool capsArray[capsLen];

for (int i = 0; i < capsLen; i++)
{
    env->GetBooleanArrayRegion(capabilities, i, 1, getbool);
    capsArray[i] = getbool;
}
JNIEXPORT bool JNICALL Java_com_NativeClient_Login(JNIEnv *env, jobject, jstring userJ, jstring passJ, jstring serJ, jboolean useJ, jstring resJ, jbooleanArray capabilities)
{
  LOGI("%s", __PRETTY_FUNCTION__);
  if (cst_ == NULL) {
    LOGE("cst is not initialized");
    return false;
  }

  std::string user = env->GetStringUTFChars(userJ, NULL);
  std::string pass = env->GetStringUTFChars(passJ, NULL);
  std::string ser = env->GetStringUTFChars(serJ, NULL);
  std::string res = env->GetStringUTFChars(resJ, NULL);
  jint capsLen = env->GetArrayLength(capabilities);
  if (capsLen <= 0) {
    LOGE("Provided capabilities array is empty or negative or errored");
    return false;
  }

  bool capsArray[capsLen];
  jboolean *getbool = env->GetBooleanArrayElements(capabilities, NULL);
  LOGE("sizeof(getbool): %d", sizeof(getbool));  // Returns: 4
  for (int i = 0; i < capsLen; i++) {
    capsArray[i] = (getbool[i] == JNI_TRUE);
    LOGE("capsArray[%d]: %d", i, capsArray[i]); // All zero
    capsArray[i] = !(getbool[i] == JNI_FALSE);
    LOGE("capsArray[%d]: %d", i, capsArray[i]);  // All one
  }

  if (!cst_->SetCapabilitiesArray(capsArray, capsLen)) {
    LOGE("Error is setting capabilities array, most likely it is a length mismatch");
    return false;
  }

  cst_->SetUserInfo(user, pass, ser, useJ, res);
  return true;
}