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

时间:2013-05-20 23:56:11

标签: java c++ java-native-interface

我正在尝试将从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代码必须将信息作为布尔值。

编辑: @sigpwned对于第一个代码块,返回值的示例(使用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;
}

1 个答案:

答案 0 :(得分:3)

所以问题不在于C ++方面的代码,而是我缺乏Java知识和顽固性,要求Java人员提供帮助。

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