3

Java から C++ に渡されるブール配列を単なるブール配列に変換しようとしています。ただし、ブール値が何であるかに関係なく、値が0より大きい数値であるため、常にtrueと評価されます。私の最新の試行コードは次のとおりです。

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++ のブール配列にリッピングするにはどうすればよいですか?

また、誰かが提案した場合に備えて、ブール配列の代わりに整数配列を使用することはできません。これは、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;
}
4

1 に答える 1