0

我正在尝试在 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[],我稍后需要访问它。我知道这jchar是一个大于的字节,char但我仍然无法理解处理这个问题的正确方法。

谢谢

4

1 回答 1

0

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

看看这个问题的公认答案

于 2017-06-30T08:52:51.327 回答