【问题标题】:Converting Java Boolean array to C++ bool array将 Java 布尔数组转换为 C++ 布尔数组
【发布时间】:2013-05-20 23:56:10
【问题描述】:

我正在尝试将一个从 Java 传递给 C++ 的布尔数组转换为一个布尔数组。但是,无论布尔值是什么,它总是被评估为真,因为该值是一个大于 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;
}

【问题讨论】:

  • C++ 程序实际上将哪些值读入getbool?也就是说,printfgetbool的所有值都读完了吗?
  • 我确实在考虑使用 int。但我也没有看到为什么您不能在获得信息后立即根据需要即时进行从 int 到 bool 的转换。假设 int 值有意义/可解析。
  • 我无法重现这种行为。如果我 printf getbool 的结果,我会得到一和零,正如预期的那样。我可以通过将它们与 JNI_TRUE 进行比较而不是强制转换来安全地将它们复制到 bool 数组中。我认为您需要展示更多代码。
  • @AeroBuffalo 我的原生代码如下:pastebin.com/DrYGYhNz 在 Windows 7 上使用 MinGW/GCC 编译。你能用你的原生方法的完整源代码更新你的帖子吗?
  • 很抱歉,我现在在您的代码中没有发现任何明显的错误。除了你不应该尝试在堆栈上实例化一个动态大小的数组 (capsArray) - 为此使用 new 和 delete 运算符。

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


【解决方案1】:

所以问题不在于代码的 C++ 方面,而是我对 Java 缺乏了解,并且固执地向 Java 人寻求帮助。

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

【讨论】:

    猜你喜欢
    • 2011-08-02
    • 2014-12-20
    • 2013-07-04
    • 2014-08-10
    • 1970-01-01
    • 2015-02-23
    • 1970-01-01
    • 1970-01-01
    • 2022-06-12
    相关资源
    最近更新 更多