Jni neue primitive Typen
-
21-09-2019 - |
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.
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