Voila, j'aimerai faire une méthode en JNI qui renvoie une tableau de String ( donc String[] ).

La voici :

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