如何将 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[] 的就地转换,我稍后需要访问它。我知道jcharchar 大一个字节,但我仍然无法理解处理这个问题的正确方法。

谢谢

【问题讨论】:

【参考方案1】:

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

看看这个question接受的答案

【讨论】:

以上是关于如何将 jchararray 作为参数发送到 C 函数的主要内容,如果未能解决你的问题,请参考以下文章

如何将参数发送到 HTTPService 调用以作为组件重用

如何将数组作为参数发送到iOS中的json服务

将 C# 字符串作为参数发送到非托管 C++ DLL 函数

将 UIImageView 作为参数发送到 WCF 服务

如何将xml参数发送到WCF?

将路由参数作为参数发送到中间件 Laravel