将布尔数组从C返回到Java
我试图通过JNI将一组布尔值从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)
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
,因为它最符合您的需要。Aconst jboolean
不是bool
。您必须通过SetBooleanArrayRegion()
aconst jboolean*
。因此,您需要创建一个jboolean
数组。好的,我的问题是如何将现有的bool数组转换为jboolean数组