[英]Returning a boolean array from C to Java
我正在尝试通过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”,但我希望能够将常规布尔数组复制到jboolean数组。
而且我不断收到这个错误
[警告]从不兼容的指针类型传递'(* env)-> SetBooleanArrayRegion'的参数5。
最后一个参数应该是“ const jboolean * buf”,
警告告诉您正在传递的数组的元素类型bool
与jboolean
不兼容,因为这两种类型恰好在您的环境中定义。 这不是您可以忽略的问题,至少不是没有更多细节。 当您传递以这种方式不匹配的参数时,没有理由期望正在调用的函数将按预期工作。
但我希望能够将常规布尔数组复制到jboolean数组。
但这不是你在做什么。 您正在尝试从bool
数组初始化jbooleanarray
(不是“ jboolean
array”)。 在一定程度上bool
和jboolean
实际上是不兼容的,这不可能通过任何可用的JNI函数来实现。 但是您可以通过jboolean
数组在jbooleanarray
设置值,如下所示:
jboolean passwordProtected[] = {JNI_TRUE, JNI_FALSE, JNI_FALSE};
jbooleanArray passwords;
passwords = (*env)->NewBooleanArray(env, 3);
(*env)-> SetBooleanArrayRegion(env, passwords, 0, 3, passwordProtected);
如果不是从本地声明一个bool
数组,而是从某个外部源获取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);
或者,使用Get
/ ReleaseBooleanArrayRegion
或Get
/ ReleaseBooleanArrayCritical
来最好地满足您的需求。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.