我有一个带有以下签名的 Java 函数:
char[] getResult()
如何从本机 C 代码调用此方法并将返回值转换为 C 字符数组?JNI 提供了一个CallCharMethod
功能,但似乎没有提供CallCharArrayMethod
或类似的功能。我是否必须将 getResult 的输出包装在字符串中并使用 CallObjectMethod?
我有一个带有以下签名的 Java 函数:
char[] getResult()
如何从本机 C 代码调用此方法并将返回值转换为 C 字符数组?JNI 提供了一个CallCharMethod
功能,但似乎没有提供CallCharArrayMethod
或类似的功能。我是否必须将 getResult 的输出包装在字符串中并使用 CallObjectMethod?
使用CallObjectMethod
;每个数组类型都是对象类型:-)
JNIEnv *env = ...;
jobject inst = ...;
jmethodID getResult_id = ...;
jcharArray array = (*env)->CallObjectMethod(env, inst, getResult_id);
确保记住 will be 的正确描述getResult
符()[C
。
这很复杂,因为 Java char 类型和 C char 类型尽管名称相同,但非常不同。
Java char 类型表示 16 位 Unicode 字符。C 的 char 也用于表示一个字符,但由于 C 早于 Unicode,因此它被视为一个字节,而且我不知道 char 超过 8 位字节的任何 C 实现(尽管标准不禁止这)。
因此,就将 Java 字符数组转换为 C 字符数组而言,您可能需要处理一些编码问题。如果您的 Unicode 字符不适合 16 位,那就更复杂了。
但是对于方法的调用,JNI 提供了调用返回原始类型的方法的函数和 Objects 的方法,而在 Java 中,数组是 Objects,所以你会想要使用CallObjectMethod
.