如何将 jchararray 作为参数发送到 C 函数



我正在尝试在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);
}

我已经通过在方法中打印它们来验证int[]很好地传递到 C 库getData()。但问题在于将jcharArray data_传递给char data[]

我已经打印了data_后使用(*env)->GetArrayLength(env, 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[]的就地转换,我稍后需要访问。我知道jcharchar大一个字节,但我仍然无法理解解决这个问题的正确方法。

谢谢

jchar不是char而是uint16_t(或unsigned short(。Java 字符串似乎具有 UTF-16 编码。

看看这个问题的接受答案

相关内容

  • 没有找到相关文章

最新更新