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
的字節,但我仍然無法理解接近此的正確方法。
由於