Question

Comment de nouveaux types primitifs en JNI. J'ai une fonction qui retourne une jobject. Il est possible de revenir jint, jchar, etc.

Il y a NewString, pourquoi ne pas NewInteger, NewCharacter, NewDouble, etc. Il n'y a pas autoboxing à couche JNI au moment.

Je peux aller avec l'appel NewObject, mais ce sera trop frais généraux pour créer des types primitifs.

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

J'ai fonctions wrapper pour obtenir classe et methodID.

Était-ce utile?

La solution

jint, jdouble, etc. ne sont pas jobjects. Comme vous le dites, ils sont variables primitives. Il suffit de les remplir!

jint someInt = 1;
jdouble someDouble = 3.14159;

Re modifier. Je vois, vous voulez retourner boxed types comme Integer, de Double, etc. Ouais, la fonction enveloppe est probablement que vous avez affichée la voie à suivre

Autres conseils

Pourquoi pensez-vous que cette approche est « trop frais généraux »? Si vous voulez retourner une valeur en boîte (qui est un objet qui est titulaire d'une primitive, pas un « type primitif »), alors vous devez créer cet objet.

Une alternative consiste à appeler la méthode valueOf() du type d'emballage.

Cependant, je pense que vous êtes mieux de retourner la valeur primitive réelle, et de le laisser se boxed (si vous avez besoin que) une fois qu'il est sur le côté Java.


Si vous êtes inquiet au sujet de la surcharge de la fonction / constructeur recherche, vous devez mettre en cache les ID de méthode. A la différence des pointeurs d'objet, ils ne changeront pas (avec quelques mises en garde: catégories Déchargée ne sont pas applicables aux emballages primitifs). Voir le point 10.7 ici: http://java.sun.com/docs /books/jni/html/pitfalls.html

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top