2013-06-28 1 views
1

Je suis nouveau sur JNI et j'ai un programme Java à partir duquel je veux appeler des méthodes en C++. J'ai un ObjectA implémenté en Java. Je reçois son ID de classe comme ceci en C++:JNI: Appeler une méthode Java en C++ avec un objet comme argument

jclass cls = env->FindClass("myPackages/ObjectA"); 

Maintenant, j'ai la méthode funcA donnée en Java. funcA accepte un objet de type ObjectA comme argument et renvoie un entier. La déclaration en Java ressemble à ceci:

public int funcA(ObjectA obj); 

Maintenant, je veux obtenir le methodID de FoncA en C++. Le problème est, je ne sais pas comment spécifier quel parametype la méthode obtient. Je sais que je dois écrire L pleinement qualifié; passer des objets comme une chaîne, mais comment faire, quand les objets ne proviennent pas de javalibraries officielles mais d'objets que j'ai créés? J'ai essayé, mais il est évident qu'elle ne fonctionne pas:

jmethodID jfuncA = env->GetMethodID(cls, "funcA", "(Lcls;)I"); 

Tout ce que je suis arrivé en réponse est que la méthode n'a pas été trouvé. Alors qu'est-ce que je dois écrire au lieu de (Lcls;)? Ou est-ce impossible?

Toute idée est utile!

+0

Ce n'est tout simplement pas le fonctionnement du langage de programmation C++. 'cls' est une variable dans votre code. Vous ne pouvez pas l'utiliser dans un littéral de chaîne! Pourquoi n'écrivez-vous pas 'myPackages/ObjectA' à la place? Alors ça marcherait. –

Répondre

5

Exécutez javap -s sur votre classe Java compilée et utilisez exactement ce qu'il vous indique comme signature de la méthode native. Couper et coller. Ne perdez pas votre temps à essayer de le comprendre par vous-même lorsque vous avez un outil qui ne se trompe jamais.

+3

'javap -s -p' pour inclure des méthodes privées. –

+1

http://dev.kanngard.net/Permalinks/ID_20050509144235.html pourrait aussi aider un peu – Jakob

+0

@Jakob Non, c'est mon point. Pourquoi le faire vous-même quand l'ordinateur peut? – EJP

Questions connexes