2017-06-30 2 views
0

アンドロイドアプリでCライブラリ(Pre-written and published)を使用しようとしています。私はこのCライブラリの周りにJNIラッパーを書くことに努力しました。私はint[]が内側にそれらを印刷してもCライブラリに通過していることを確認しましたC関数へのパラメータとしてjchararrayを送信する方法

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); 
} 

のように私のJNIラッパーが見え

int getData(char data[], const int dataLen, int unit[], const int unitLen) { 
... 
} 
C.

に適切 jchararrayに渡す方法を見つけ出すことはできません getData()メソッド。しかし問題は 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よりも大きいバイトであることを理解していますが、これに近づく正しい方法をまだ理解できません。

おかげ

答えて

0

jcharcharではなく、むしろuint16_t(またはunsigned short)ではありません。 Java文字列はUTF-16エンコーディングを持つようです。

question

関連する問題