Question

Je l'ai trouvé beaucoup de tutoriels / questions sur Stackoverflow qui traitent de la copie des tableaux char de côté C / JNI dans quelque chose comme un octet [] en Java, mais pas l'inverse.

J'utilise une bibliothèque C native qui attend un tableau d'octets. Je veux simplement obtenir des données à partir d'un octet [] en Java, dans de préférence un unsigned char [] en C.

Longue histoire courte: Quelle est la meilleure façon de copier les données d'un jBytearray dans JNI? Est-il possible de détecter sa taille?

Était-ce utile?

La solution

Voici un exemple de travail que je viens levais de mon AS / 400 bibliothèque JNI pour résoudre un pointeur de file d'attente d'utilisateur natif pour tester l'existence de la file d'attente - il copie la bibliothèque de file d'attente et le nom d'un tableau d'octets Java (déjà traduit CCSID de travail) en code natif et l'utilise. Prenez note des appels de fonction de libération; ceux-ci peuvent être modifiés pour copier le contenu du tableau natif de nouveau dans les tableaux d'octets Java pour transférer les données dans l'autre sens:

JNIEXPORT jboolean JNICALL Java_com_mycompany_jni400_UserQueue_jniResolve(JNIEnv *jep,jobject thsObj,                
jbyteArray queueLibrary,jbyteArray queueName) {                                                                             
    jbyte            *lib,*nam;                                                                                             
    bool             rtn;                                                                                                   

    thsObj=thsObj;                                                                                                          
    lib=(*jep)->GetByteArrayElements(jep,queueLibrary,0);                                                                   
    nam=(*jep)->GetByteArrayElements(jep,queueName,0);                                                                      
    rtn=(usrq_resolve((byte*)lib,(byte*)nam)!=NULL);                                                                        
    (*jep)->ReleaseByteArrayElements(jep,queueLibrary,lib,JNI_ABORT); /* abort to not copy back contents */                 
    (*jep)->ReleaseByteArrayElements(jep,queueName   ,nam,JNI_ABORT); /* abort to not copy back contents */                 
    if(rtn) { return JNI_TRUE;  }                                                                                           
    else    { return JNI_FALSE; }                                                                                           
    }                                                                                                                       

Autres conseils

La meilleure façon de copier un octet Java [] à un char* natif est d'utiliser l'appel GetByteArrayRegion. Il fait exactement ce que vous voulez. Copie tout ou partie d'un tableau d'octets dans un tampon natif

Utilisation GetByteArrayElements / ReleaseByteArrayElements nécessite deux appels au lieu d'un, et en fonction de la mise en œuvre de la machine virtuelle soit épingler l'octet [] en mémoire pour empêcher le GC de le déplacer, ou faire une copie de sorte que le GC peut se déplacer librement l'original sans perturbant le code natif. (Cela signifie également que JNI_ABORT sera soit « annuler » les modifications ou les laisser intactes, selon que le tampon a été épinglé ou copié.)

(Voir aussi la section "Appels Région" du JNI Conseils document.)

L'appel GetArrayLength peut être utilisé pour déterminer la taille de la byte[].

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top