如何将 jchararray 作为参数发送到 C 函数
Posted
技术标签:
【中文标题】如何将 jchararray 作为参数发送到 C 函数【英文标题】:How to send a jchararray as parameter to C function 【发布时间】:2017-06-30 05:39:54 【问题描述】:我正在尝试在 android 应用程序中使用 C 库(预先编写和发布)。我开始着手围绕这个 C 库编写 JNI 包装器。我不知道如何正确地将jchararray
传递给 C。
int getData(char data[], const int dataLen, int unit[], const int unitLen)
...
我的 JNI 包装器看起来像
Java_eg_test_freqProcessor(JNIEnv *env, jclass type, jcharArray data_,
jintArray unit_)
jchar *data = (*env)->GetCharArrayElements(env, data_, NULL);
jsize dataLen = (*env)->GetArrayLength(env, data_);
jint *unit = (*env)->GetIntArrayElements(env, unit_, NULL);
jsize unitLen = (*env)->GetArrayLength(env, unit_);
getData(data, dataLen, unit, unitLen);
(*env)->ReleaseCharArrayElements(env, data_, data, 0);
(*env)->ReleaseIntArrayElements(env, unit_, unit, 0);
我已经通过在getData()
方法中打印int[]
来很好地传递到C 库。但问题在于将jcharArray data_
传递给char data[]
在使用(*env)->GetArrayLength(env, data_);
获得长度后,我已经打印出data_
。当我在 Java_eg_test_freqProcessor
方法中打印时,我看到了
06-29 23:05:42.364 12278 12348 V EEG :
06-29 23:05:42.364 12278 12348 V EEG : "
06-29 23:05:42.364 12278 12348 V EEG : 0
06-29 23:05:42.364 12278 12348 V EEG : "
06-29 23:05:42.364 12278 12348 V EEG : :
06-29 23:05:42.364 12278 12348 V EEG :
06-29 23:05:42.364 12278 12348 V EEG : 1
06-29 23:05:42.364 12278 12348 V EEG :
但在 getData()
方法中,如果我在同一个集合上进行迭代,我只会看到一半的数据。
06-29 23:08:07.801 12573 12651 V EEG Inside: 0 : :
06-29 23:08:07.802 12573 12651 V EEG Inside: 1 :
06-29 23:08:07.802 12573 12651 V EEG Inside: 2 : ":
06-29 23:08:07.802 12573 12651 V EEG Inside: 3 :
06-29 23:08:07.802 12573 12651 V EEG Inside: 4 : 0:
06-29 23:08:07.802 12573 12651 V EEG Inside: 5 :
06-29 23:08:07.802 12573 12651 V EEG Inside: 6 : ":
06-29 23:08:07.802 12573 12651 V EEG Inside: 7 :
这个库执行data[]
的就地转换,我稍后需要访问它。我知道jchar
比char
大一个字节,但我仍然无法理解处理这个问题的正确方法。
谢谢
【问题讨论】:
【参考方案1】:jchar
不是char
而是uint16_t
(或unsigned short
)。 Java 字符串似乎具有 UTF-16 编码。
看看这个question接受的答案
【讨论】:
以上是关于如何将 jchararray 作为参数发送到 C 函数的主要内容,如果未能解决你的问题,请参考以下文章