-2-

    II. Possibilités offertes par le JNI


      2. Manipuler des tableaux



Les tableaux sont largement employés en Java. A l’intérieur du code natif, les tableaux permettent de fournir des fonctionnalités aux chaînes de caractères et peuvent également éviter de manipuler explicitement des pointeurs. Afin de permettre d’utiliser les tableaux entre du code Java et du code C/C++, un ensemble de fonctions est fourni par le JNI. On peut ainsi créer, manipuler et dimensionner des tableaux.

 

Création de tableaux

La possibilité de pouvoir créer de nouveaux tableaux Java depuis du code natif est parfois essentiel. En effet, il faut savoir que la manipulation de tableaux en Java peut être certaines fois beaucoup plus lourde que dans un langage natif. Cela s’explique en partie par le fait que les tableaux en Java occupent des espaces non contigus. Une solution envisageable consiste à manipuler des tableaux du côté natif pour les fournir au Java au travers du JNI.

Pour ce faire, une première catégorie de fonctions JNI permet de créer des tableaux. Celles-ci portent toutes un nom du type NewTypeArrayType représente le type de tableau à créer. Seulement une fois créé, un tableau déclaré du côté natif doit être explicitement initialisé (contrairement en Java où par défaut un tableau d’entiers est automatiquement initialisé à 0, et à nul pour un tableau d’objets).

 

Manipulation de tableaux

Deux fonctions principales ont été intégrées au JNI afin de pouvoir d’une part récupérer des tableaux d’éléments ( GetTypeArrayElements ) et d’autre part, pour propager des modifications vers le code Java ( ReleaseTypeArrayElements ).

 

Exemple :

...

int i ;

int len=3;

float sum = 0;

jfloat *body = (*env)->GetFloatArrayElements(env, arr,0, len);

for (i=0; i<len; i++) { sum += body[i]; }

body[0]=sum ;

env->ReleaseFloatArrayElements(env, arr, body);

...

D’autres fonctions viennent compléter celles décrites ci-dessus, entre autre GetArrayLength permet de connaître la taille d’un tableau Java.

 

Section critique

Depuis la version 1.2 de Java, de nouvelles fonctions ont aussi vu le jour. Elles fournissent de nouvelles méthodes d’extraction des tableaux. Les deux fonctions GetPrimitiveArrayCritical() et ReleasePrimitiveArrayCritical() permettent de récupérer avec certitude des informations stockées dans la mémoire. Cela n’était pas garanti avec GetTypeArrayElements() et ReleaseTypeArrayElements() car certaines fois le garbage collector nettoyait brusquement les zone de stockage des tableaux, ce qui provoquait certaines erreurs d’exécutions dans Java 1.1.

Beaucoup d’informations existent encore sur ce sujet et le mieux consiste à se référer à la documentation complète de JNI, consultable depuis la rubrique Télécharger.


Rédigé par Cyril MOQUEREAU