2013-05-20 124 views
3

我想转换为从Java传递到C++的布尔数组只是一个布尔型数组。然而,无论布尔值是什么,它总是被判断为真,因为该值大于0.我的最新尝试代码的数是:将Java布尔数组转换为C++布尔数组

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; 
} 

这两位代码都给出了​​变量的一个大于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; 
} 
+0

C++程序实际上将什么值读入'getbool'?换句话说,你可以在读取之后'printf' getbool的所有值吗? – sigpwned

+0

我的确在想用int。但我也没有看到为什么你不能在获得信息后根据需要在int上快速转换为bool。假设int值有意义/可解析。 – LanternMike

+0

@sigpwned:查看更新。 – AeroBuffalo

回答

3

所以这个问题,不是用代码C++的一面,但我缺乏的Java知识和固执的问Java的人寻求帮助。

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