Voila, j'aimerai faire une méthode en JNI qui renvoie une tableau de String ( donc String[] ).
La voici :
Cependant, quand je l'utilise j'obtient ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 JNIEXPORT jobjectArray JNICALL Java_ProcessHelper_getListProcesses (JNIEnv *env, jobject obj) { int i = 0, size; char outbuf[MAX_PATH]; jobjectArray result; jclass stringArrayCls ; size = (int) GetTaskList(); stringArrayCls = (*env)->FindClass(env, "[Ljava/lang/String;"); if(stringArrayCls == NULL) { printf("Impossible de creer la classe de Tableau de String"); return NULL; } result = (*env)->NewObjectArray(env, size, stringArrayCls, NULL); if(result == NULL) { return NULL; } // temporaire mais pour être sur d'avoir une chaine valide strcpy(outbuf, "test"); for(i = 0 ; i < 10; i++) { jstring temp = (*env)->NewStringUTF(env, outbuf); (*env)->SetObjectArrayElement(env, result, i, temp); (*env)->DeleteLocalRef(env, temp); } return result; }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 Exception in thread "main" java.lang.ArrayStoreException at ProcessHelper.getListProcesses(Native Method) at ProcessHelper.main(ProcessHelper.java:21) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:90)
Etant mes premiers pas en JNI, je cherche mais je vois pas ou est le probleme.
RQ : si vous avez des remarques sur ma manière de programmer en JNI ( mauvaise gestion de mémoire etc ), je suis preneur.
Partager