Domanda Restituisce una matrice di stringhe su un metodo JNI


Ho bisogno di ottenere un elenco di stringhe (char *) da C ++ e restituirlo a Java.

Come lo posso fare?

Penso che una soluzione sia restituire una grande stringa predefinita come: "[item1] [item2]" e creare una divisione su Java, ma non sembra l'approccio giusto.


16
2018-05-18 15:23


origine


risposte:


Guarda a NewObjectArray nel documento JNI.

Fondamentalmente è possibile restituire dalla funzione JNI una Array Of String (Java) e quindi trasformarla in a List o qualsiasi tipo di tipo di raccolta.

Codice peudo:

Giava:

....
public List<String> getFooAsList(){
  return new ArrayList(this.getData());
}  
private native String[] getData();

JNI

#include <jni.h>


  JNIEXPORT jobjectArray JNICALL 
               como_foo_bar_getData
  (JNIEnv *env, jobject jobj){

    jobjectArray ret;
    int i;

    char *data[5]= {"A", "B", "C", "D", "E"};

    ret= (jobjectArray)env->NewObjectArray(5,env->FindClass("java/lang/String"),env->NewStringUTF(""));

    for(i=0;i<5;i++) env->SetObjectArrayElement(ret,i,env->NewStringUTF(data[i]));

    return(ret);
 }

Non testato!!!

Fammi sapere se funziona per te

Saluti


22
2018-05-18 15:53



ret= (jobjectArray)env->NewObjectArray(5,env->FindClass("java/lang/String"),env->NewStringUTF(""));

Penso che l'elemento iniziale inizializzato su "" (stringa vuota)

env->NewStringUTF("")

non è necessario, poiché si assegna un nuovo valore all'elemento array subito dopo:

for(i=0;i<5;i++) env->SetObjectArrayElement(ret,i,env->NewStringUTF(data[i]));

In questo caso sarebbe sufficiente un semplice "NULL", poiché l'elemento iniziale specificato sarà eleggibile per la garbage collection non appena viene eseguita la riga successiva. È come scrivere quanto segue nel codice Java:

int i = 0;
i = 1;

O peggio:

Object object = new BigObjectVeryHeavyToInitialize();
object = new AnotherObject();

Il tuo IDE preferito ti farebbe un piccolo avvertimento per questo.


4
2018-02-14 00:40