我正在尝试将从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;
}
jbooleanArray capabilities
。 - AeroBuffalo