将Java的布尔数组转换为C++的布尔数组

3

我正在尝试将从Java传递到C++的布尔数组转换为仅为bool数组。然而,无论布尔值是什么,它始终被评估为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]

我也尝试过:

jboolean getbool[1];
bool capsArray[capsLen];

for (int i = 0; i < capsLen; i++)
{
    env->GetBooleanArrayRegion(capabilities, i, 1, getbool);
    capsArray[i] = getbool;
}

两段代码都给getbool变量赋予了大于1的整数值。
我不确定我做错了什么,也找不到任何在线示例代码可用(如果我能找到任何东西的话)。我应该如何从从Java传递的jbooleanArray中提取布尔值到C++中的bool数组?
此外,如果有人建议这样做,我不能使用整数数组代替布尔数组,因为Java代码必须将信息作为布尔值。
编辑:对于第一个代码块,返回值的示例(使用printf("%d", getbool[i])):
208、160、155、65、248、106、154、65、248、106、154、65
应注意,这些数字并不总是一致的。
编辑:提供的布尔值为:
F、T、T、F、F、F、T、F、T、F、T、T
编辑:完整函数代码
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;
}

我确实在考虑使用 int。但我也不明白为什么不能在获取信息后根据需要立即将 int 转换为 bool,假设 int 值是有意义的/可解析的。 - LanternMike
2
我无法重现那种行为。如果我使用printf打印getbool的结果,我会得到预期的1和0。我可以通过将它们与JNI_TRUE进行比较而不是强制转换来安全地将它们复制到bool数组中。我认为你需要展示更多的代码。 - jkovacs
@user2758929:你正在测试哪个代码块?我已经尝试取出 getbool 并将其与 JNI_TRUE 和 JNI_FALSE 进行比较,但都没有达到预期结果。唯一相关的附加代码只有传递到该函数中的参数 jbooleanArray capabilities - AeroBuffalo
1
@AeroBuffalo 我的本地代码如下:http://pastebin.com/DrYGYhNz 在Windows 7上使用MinGW/GCC编译。你能否更新你的帖子,包含完整的本地方法源代码? - jkovacs
1
很抱歉,我目前没有发现您代码中的任何明显错误。除了您不应该尝试在堆栈上实例化动态大小的数组(capsArray)- 应该使用new和delete运算符来完成。 - jkovacs
显示剩余7条评论
1个回答

3

所以问题并不是由于C++代码,而是我对Java的知识缺乏和不愿意请求Java人员的帮助造成的。

事实证明,我正在构建和传递给我的函数一个Boolean caps[],而不是一个boolean caps[]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接