Frage

Wie können wir neue primitive Typen in JNI? Ich habe eine Funktion, die a zurückgibt jobject. Es ist möglich, zurückzukehren jint, jchar, etc.

Es gibt NewString, warum nicht NewInteger, NewCharacter, NewDouble, usw. Es gibt momentan kein Autoboxing auf der JNI -Schicht.

Ich kann mit dem gehen NewObject Rufen Sie an, aber dies wird zu viel Overhead sein, um primitive Typen zu erstellen.

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

Ich habe Wrapper -Funktionen, um Klasse und Methode zu erhalten.

War es hilfreich?

Lösung

jint, jdouble, usw. sind nicht jobjects. Wie Sie sagen, sind sie primitive Variablen. Füllen Sie sie einfach aus!

jint someInt = 1;
jdouble someDouble = 3.14159;

Re Edit: Ich sehe, Sie möchten zurückkehren Boxed Typen wie Integer, Double, usw. Ja, die Wrapper -Funktion, die Sie gepostet haben, ist wahrscheinlich der richtige Weg.

Andere Tipps

Warum ist der Meinung, dass dieser Ansatz "zu viel Overhead" ist? Wenn Sie einen Box -Wert zurückgeben möchten (was ein Objekt ist, das einen primitiven, keinen "primitiven Typ" enthält), müssen Sie dieses Objekt erstellen.

Eine Alternative besteht darin, die anzurufen valueOf() Methode auf dem Wrapper -Typ.

Ich denke, Sie sind jedoch besser dran, den tatsächlichen primitiven Wert zurückzugeben, und lassen Sie ihn (wenn Sie das brauchen), sobald er auf der Java -Seite ist.


Wenn Sie sich Sorgen über den Overhead für die Funktion für Funktion/Konstruktor besorgen, sollten Sie die Methoden -IDs zwischenspeichern. Im Gegensatz zu Objektzeigern ändern sie sich nicht (mit einigen Einschränkungen, die nicht für primitive Wrapper gelten). Siehe Artikel 10.7 HIER: http://java.sun.com/docs/books/jni/html/pitfalls.html

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top