2010-03-22 4 views
4

Comment pouvons-nous nouveaux types primitifs dans JNI. J'ai une fonction qui renvoie un jobject. Il est possible de revenir jint, jchar, etc.JNI nouveaux types primitifs

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 le NewObject appel, 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.

+0

@Firat - si vous vous préoccupez de ce genre de chose, c'est un signe que votre application a * trop de JNI *. –

+1

Notre API Java utilise le code C. Tout dépend de la performance des appels JNI. C'est pourquoi je fais de mon mieux pour rendre cette partie aussi rapide que possible. – Firat

Répondre

7

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

jint someInt = 1; 
jdouble someDouble = 3.14159; 

modifier Re: Je vois, vous voulez retourner en boîte types comme Integer, Double, etc. Ouais, la fonction enveloppe que vous avez envoyé sans doute la voie à suivre.

+0

Je sais que ce ne sont pas des types jobject. Mais existe-t-il une meilleure façon de créer jobject que de passer par NewObject route? JNI a NewString, mais pas l'appel NewXXX des types primitifs. – Firat

+1

@Firat: J'ai une « meilleure » façon, ce qui est d'appeler la méthode 'valueOf' du type boîte, mais qui est vraiment juste appeler une méthode d'usine et est fonctionnellement pas différent d'utiliser' NewObject'. :-P –

+0

Je pensais que ça pourrait être une meilleure idée, cependant valueOf prend String comme argument. J'aurais besoin de NewString, et appeler la fonction statique. – Firat

1

Pourquoi vous sentez-vous que cette approche est « trop frais généraux »? Si vous voulez renvoyer une valeur encadrée (qui est un objet qui contient une primitive, pas un "type primitif"), 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 s'en boîte (si vous avez besoin que) une fois qu'il est sur le côté Java.


Si vous êtes préoccupé par la surcharge de la recherche fonction/constructeur, vous devez mettre en cache les ID de méthode. Contrairement aux pointeurs d'objets, ils ne changeront pas (avec certaines mises en garde sur les classes déchargées qui ne s'appliquent pas aux wrappers primitifs). Voir l'article 10.7 ici: http://java.sun.com/docs/books/jni/html/pitfalls.html

+0

Je pense que le PO essaye d'implémenter une interface qui exige l'objet encadré sur le retour; À moins de changer l'interface, vous n'avez aucun moyen de retourner directement la primitive. –

+0

L'opération doit renvoyer le type de projet. Il est similaire à Map.put (clé, valeur) qui renvoie un objet s'il existe avec une clé similaire. La surcharge est chaque fois que je devrais trouver la classe, obtenir methodId. Il est possible de les mettre en cache pour l'améliorer, mais ce serait bien si l'interface JNI avait ces fonctions. – Firat

Questions connexes