【发布时间】:2014-07-27 09:59:50
【问题描述】:
我无法找到将字符缓冲区从 JNI 方法传递到 Java 方法的正确文档。这是代码
jint JNICALL Java_foo_package_MyJavaClass_myNativeMethod(JNIEnv *jenv, jobject jobj)
{
jclass clazz = (*jenv)->GetObjectClass(jenv, jobj);
// MyJavaClass method: private void addData(byte[] data)
jmethodID mid = (*jenv)->GetMethodID(jenv, clazz, "addData", "([B)V");
assert(mid);
const char buf[] = { 0, 1, 2, 3, 42 };
const size_t buf_len = sizeof buf;
(*jenv)->CallVoidMethod(jenv, jobj, mid, buf /* obviously wrong */ );
return 0;
}
CallVoidMethod 是在这里使用的正确函数吗,传递给它的正确内容是什么,如何分配它,以及应该如何(如果有的话)释放它?
代码 sn-p 可能是最简洁的答案,用几句话解释对象的所有权是如何变化的。
【问题讨论】:
-
我认为您必须将 GetMethodID 参数类型更改为“([C)V”。
-
@Yohji 不,
C是 Javachar,它是 16 位的,代表一个 unicode 字符。 Cchar表示一个本地字节(在这种情况下假定为 8 位),通常(但不是这里)用于表示任何 8 位编码的 8 位字符。 -
@hyde Java
char拥有一个 UTF-16 代码单元;其中一个或两个代表一个 Unicode 字符。 Character.toChars(int) 提供了简洁的解释。
标签: java c arrays java-native-interface argument-passing