2017-06-30 1 views
0

J'essaie d'utiliser une bibliothèque C (pré-écrite et publiée) dans une application Android. J'ai commencé mon effort sur l'écriture d'un wrapper JNI autour de cette bibliothèque C. Je ne peux pas comprendre comment passer en jchararray correctement à C.Comment envoyer un jchararray en tant que paramètre à la fonction C

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

Mon wrapper JNI ressemble

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

J'ai vérifié que int[] passent par la bibliothèque C et en les imprimant à l'intérieur getData() méthode. Mais le problème est avec le passage jcharArray data_ à char data[]

J'ai imprimé le data_ après avoir obtenu la longueur en utilisant (*env)->GetArrayLength(env, data_);. Lorsque j'imprime à l'intérieur méthode Java_eg_test_freqProcessor, je vois

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 : } 

Mais dans la méthode getData(), si j'itérer sur le même ensemble, je ne vois que la moitié des données.

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 : 

Cette bibliothèque effectue en place la transformation de data[] que je besoin d'accéder plus tard. Je comprends que jchar est un octet plus grand que char mais je n'arrive toujours pas à comprendre la bonne façon d'aborder cela.

Merci

Répondre

0

jchar n'est pas char mais uint16_t (ou unsigned short). Les chaînes Java semblent avoir un codage UTF-16.

Jetez un oeil à la réponse acceptée pour ce question