È improbabile che venga utilizzato l'indirizzo di va_list fino a Java. Ecco alcuni snippet che mostrano come passare un array usando "..." e va_list. Aggiungi errore/eccezione/controllo di ritorno secondo necessità.
In Java:
static private void javaDefineArray(Object ... args) {
for (Object o : args) {
print("javaDefineArray " + o);
}
}
In C:
// Lookup the method using GetMethodID or GetStaticMethodID
mid = (*env)->GetStaticMethodID(env, class, "javaDefineArray", "([Ljava/lang/Object;)V");
// C function taking variable args (all String in this example)
static void javaDefineArray(JNIEnv * env, jobject o, ...) {
int i = 0;
int count = 0;
char * msg[100+1] = {0}; // 100 args max
jobjectArray ja;
va_list list;
va_start(list, o);
do {msg[count] = va_arg(list,char *);
} while(msg[count] !=0 && ++count < 100); // end/saftey check
va_end(list);
ja = (*env)->NewObjectArray(env, count, (*env)->FindClass(env, "java/lang/String"), (*env)->NewStringUTF(env, ""));
for(i=0;i!=count;i++) {
(*env)->SetObjectArrayElement(env,ja,i,(*env)->NewStringUTF(env, msg[i]));
}
(*env)->CallVoidMethod(env, o, mid, ja);
}
C Uso:
javaDefineArray(env, o, "0", "1", "2", "3", "4", NULL);
Java uscita:
javaDefineArray 0
javaDefineArray 1
javaDefineArray 2
javaDefineArray 3
javaDefineArray 4
Non un esperto con Java o JNI, ma varargs Java sono essenzialmente matrici, mentre varargs C sono ... disordinati e non sicuri. Probabilmente la tua funzione C ha bisogno di costruire correttamente la matrice e invocare la funzione Java con quella. –
Sì, posso costruire un array di oggetti, ma mi aspetto che esista una soluzione più bella. Ad esempio, il richiamo del costruttore java ha un metodo che riceve C valist –
@Pavel: Penso che tu stia sopravvalutando JNI. Sei aperto all'utilizzo di JNA? So che può creare metodi varargs Java che avvolgono le funzioni di varargs di C, non so se sarebbe in grado di fare il contrario. –