2017-09-22 1 views
-2

J'ai rencontré un problème avec return jobject.Comment puis-je retourner un jobjob si j'ai un cours?

Je classe:

class KeyPair { 

     std::vector<BYTE> _publicKey; 
     std::vector<BYTE> _privateKey; 

    public: 
     void SetKeys(std::vector<BYTE> publicKey, std::vector<BYTE> privateKey) 
     { 
      _publicKey = publicKey; 
      _privateKey = privateKey; 
     }; 
    }; 

et la fonction:

JNIEXPORT jobject JNICALL function(JNIEnv *env, jobject) 
{ 
    //some code 
    KeyPair keyPair; 
    keyPair.SetKeys(pub, priv); 
    return keyPair;//error 
} 

Comment puis-je retourner KeyPair comme jobjecct?

+0

Bienvenue sur JNI. Le workflow consiste à définir une classe Java, marquer certaines méthodes comme natives, exécuter javac pour obtenir un fichier .class, exécuter javah pour obtenir un fichier .h, puis implémenter les fonctions dans un langage compatible basé sur le fichier .h. Vous pourriez trouver javap -s utile lors de l'appel de fonctions JNI. En outre, considérez SWiG et JNA comme des outils JNI qui effectuent le flux de travail dans la direction opposée. SWiG pourrait vous servir le mieux ici. –

Répondre

0

Vous ne pouvez pas convertir des objets C++ en jobject comme cela.

Une approche consiste à définir une classe Java KeyPair qui a un champ private long ptr dans lequel vous insérez un pointeur vers un objet C++ KeyPair. Cela aide si vous créez un constructeur à un seul argument qui remplit le champ ptr avec son argument.

Pour créer une telle chose: (voir aussi How to create an object with JNI?)

  • Regardez la JClass associée à votre classe java KeyPair (env->FindClass). Rechercher le constructeur (env->GetMethodId)
  • Instancier l'objet (env->NewObject).
  • Enfin, renvoyez jobject.

Si vous avez besoin plus tard pour extraire le ptr d'un KeyPair passé en jobject, vous devez rechercher l'ID de champ pour ptr et utiliser env->GetLongField pour l'extraire.

0

Pouvez-vous coller ici l'erreur? En fait, vous ne pouvez pas retourner une classe - cela n'a tout simplement pas de sens, vous renvoyez toujours un objet, c'est une instance de la classe.