Domanda

Come possiamo creare nuovi tipi primitivi in ​​JNI.Ho una funzione che restituisce a jobject.E' possibile ritornare jint, jchar, eccetera.

C'è NewString, perché no NewInteger, NewCharacter, NewDouble, eccetera.Al momento non è disponibile l'autoboxing a livello JNI.

Posso andare con il NewObject chiamare, ma questo sarebbe un sovraccarico eccessivo per creare tipi primitivi.

jobject NewInteger(JNIEnv* env, jint value)
{
    jclass cls = FindClass(env, "java/lang/Integer");
    jmethodID methodID = GetMethodID(env, cls, "<init>", "(I)V", false);
    return env->NewObject(cls, methodID, value);
}

Ho funzioni wrapper per ottenere Classe e MethodID.

È stato utile?

Soluzione

jint, jdouble, eccetera.non sono jobjects.Come dici tu, sono variabili primitive.Basta compilarli!

jint someInt = 1;
jdouble someDouble = 3.14159;

Rimodifica:Capisco, vuoi tornare Incorniciato tipi come Integer, Double, eccetera.Sì, la funzione wrapper che hai pubblicato è probabilmente la strada da percorrere.

Altri suggerimenti

Perché ritieni che questo approccio sia "troppo oneroso"?Se vuoi restituire un valore boxed (che è un oggetto che contiene una primitiva, non un "tipo primitivo") allora devi creare quell'oggetto.

Un'alternativa è chiamare il valueOf() metodo sul tipo di wrapper.

Tuttavia, penso che sia meglio restituire il valore primitivo effettivo e lasciarlo inscatolare (se ne hai bisogno) una volta che è sul lato Java.


Se sei preoccupato per il sovraccarico per la ricerca di funzione/costruttore, dovresti memorizzare nella cache gli ID del metodo.A differenza dei puntatori agli oggetti, non cambieranno (con alcuni avvertimenti, le classi ricaricate non si applicano ai wrapper primitivi).Vedere il punto 10.7 qui: http://java.sun.com/docs/books/jni/html/pitfalls.html

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top