我正在尝试将一个从 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;
}