将布尔数组从C返回到Java

将布尔数组从C返回到Java,java,c,java-native-interface,Java,C,Java Native Interface,我试图通过JNI将一组布尔值从c返回到java JNIEXPORT jbooleanArray JNICALL Java_NetworkGUI_passwordProtected(JNIEnv *env, jobject obj) { bool passwordProtected[3]; passwordProtected = {true, false, false} jbooleanArray passwords; passwords = (*env)

我试图通过JNI将一组布尔值从c返回到java

JNIEXPORT jbooleanArray JNICALL Java_NetworkGUI_passwordProtected(JNIEnv 
*env, jobject obj)
{
    bool passwordProtected[3];

    passwordProtected = {true, false, false} 
    jbooleanArray passwords;

    passwords = (*env) -> NewBooleanArray(env, 3); 

    (*env)-> SetBooleanArrayRegion(env, passwords, 0, 3, 
     passwordProtected);

    return (passwords);
}
我不断地犯这个错误

[警告]正在从不兼容的指针类型传递“(*env)->SetBooleanArrayRegion”的参数5

最后一个参数应该是“const jboolean*buf”,但我希望能够将常规bool数组复制到jboolean数组

我不断地犯这个错误

[警告]正在从传递“(*env)->SetBooleanArrayRegion”的参数5 不兼容的指针类型

最后一个参数应该是“const jboolean*buf”

警告告诉您,您要传递的数组的元素类型,
bool
,不是与
jboolean
兼容的类型,因为这两种类型恰好是在您的环境中定义的。这不是一个你可以忽略的问题,至少没有更多的细节。当您以这种方式传递一个不匹配的参数时,没有理由期望您正在调用的函数会像预期的那样工作

但是我想要 能够将常规布尔数组复制到jboolean数组

但那不是你要做的。您正试图从
bool
数组初始化
jboolean数组(而不是“
jboolean
array”)。如果
bool
jboolean
确实不兼容,那么通过任何可用的JNI函数都不可能做到这一点。但是您可以从
jboolean
数组中设置
jboolean数组中的值,如下所示:

jboolean passwordProtected[] = {JNI_TRUE, JNI_FALSE, JNI_FALSE};
jbooleanArray passwords;

passwords = (*env)->NewBooleanArray(env, 3); 

(*env)-> SetBooleanArrayRegion(env, passwords, 0, 3, passwordProtected);

如果不是在本地声明一个,而是从一些外部源获取
bool
数组,这样就不能直接切换到
jboolean
,那么最好的选择可能是通过
GetBooleanArrayElements
jbooleanarray
获取
jboolean
数组,通过适当的循环复制值,然后以
ReleaseBooleanArrayElements
结束:

bool passwordProtected[] = {true, false, false};
jbooleanArray passwords = (*env)->NewBooleanArray(env, 3);
jboolean *password_elements = (*env)->GetBooleanArrayElements(env, passwords, NULL); 

for (int i = 0; i < 3; i++) {
    password_elements[i] = passwordProtected[i] ? JNI_TRUE : JNI_FALSE;
}

(*env)->ReleaseBooleanArrayElements(env, passwords, password_elements, 0);
bool passwordProtected[]={true,false,false};
jbooleanArray密码=(*env)->NewBooleanArray(env,3);
jboolean*password_元素=(*env)->GetBooleanArrayElements(env,passwords,NULL);
对于(int i=0;i<3;i++){
password\u elements[i]=passwordProtected[i]?JNI\u TRUE:JNI\u FALSE;
}
(*env)->ReleaseBooleanArrayElements(env,passwords,password_元素,0);

或者,使用
Get
/
ReleaseBooleanArrayRegion
Get
/
ReleaseBooleanArrayCritical
,因为它最符合您的需要。

A
const jboolean
不是
bool
。您必须通过
SetBooleanArrayRegion()
a
const jboolean*
。因此,您需要创建一个
jboolean
数组。好的,我的问题是如何将现有的bool数组转换为jboolean数组