2017-06-30 85 views
0

我想在android應用程序中使用C庫(預編寫和發佈)。我開始在圍繞這個C庫編寫一個JNI包裝器上做出努力。我無法弄清楚如何在jchararray正確傳遞到C如何將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的字節,但我仍然無法理解接近此的正確方法。

由於

回答

0

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

看看這個接受的答案question

相關問題