La meilleure façon de lever des exceptions dans JNI code?
Je voudrais un uniforme et simple de lancer des exceptions dans JNI code; quelque chose qui gère les enchaînés exceptions (implicitement à l'env->ExceptionOccurred méthode, ou explicitement par les paramètres, de toute façon c'est bon) et qui me sauve la recherche de constructeurs chaque fois que je veux faire. Tous les ci-dessus est de préférence en C, bien que je puisse le traduire en C++ au besoin.
Quelqu'un sur DONC avoir quelque chose comme ce qu'ils peuvent partager?
- Par poignées enchaîné exceptions " voulez-vous dire que votre code avis un attraper un Java exception de niveau sur le retour de Java vers C++, de l'envelopper dans quelque autre exception, et jeter cette nouvelle exception sauvegarder à partir de C++ à Java?
Vous devez vous connecter pour publier un commentaire.
Nous venons de code de l'utilitaire de méthodes pour chacun des types d'exceptions, nous voulons jeter. Voici quelques exemples:
De cette façon, il est facile de les trouver, votre achèvement de code editor vous permet de les saisir, et vous pouvez passer des paramètres simples.
Je suis sûr que vous pourriez développer pour gérer enchaîné les exceptions, ou d'autres plus compliquées, les démarches. Ce fut suffisant pour répondre à nos besoins.
throwNoClassDefError
résultat dans une récursion infinie et une inévitable de débordement de pile? Il faut vraiment ne jamais arriver, je l'avoue, mais qui ne semble pas être le moyen le plus approprié de le gérer. Peut-être se rabattre surjava.lang.error
, etabort()
ou quelque chose si cela ne fonctionne pas.- Je simplement utiliser 2 lignes:
Produit:
Mon code commence en Java, invoque C++, qui invoque ensuite le Java de retour pour des choses comme trouver, obtenir et la définition de valeurs de champ.
Dans cas quelqu'un qui recherche un C++ approche trouve cette page, je vais la labourer avec ce:
Ce que je suis en train de faire maintenant est d'emballage de mon JNI le corps de méthode avec un C++ bloc try/catch,
où PendingException est déclaré trivialement:
et je suis en invoquant la méthode suivante après avoir invoqué tout JNI à partir de C++, donc si l'exception Java statut indique une erreur, je vais caution immédiatement et laissez-la Java normal de gestion des exceptions ajouter le (Native method) de la ligne de la trace de la pile, tout en donnant le C++ la possibilité de nettoyer tout en vous détendant:
Mon Java trace de la pile ressemble à ça pour un échec de l'env->GetFieldId() appel:
et assez similaires, si j'appelle à une méthode Java qui lance:
Je ne peux pas parler à entourer l'exception Java au sein d'une autre exception Java à partir de C++, je pense que c'est une partie de votre question - je n'ai pas trouvé la nécessité de le faire - mais si je le faisais, je serais soit le faire avec une classe Java wrapper autour de la native méthodes, ou tout simplement de prolonger mon exception des jets de méthodes pour prendre un jthrowable et remplacer l'env->ThrowNew() avec quelque chose de laid: il est malheureux que le Soleil ne fournit pas une version de ThrowNew qui a eu un jthrowable.
Je ne voudrais pas envisager la mise en cache (exception) constructeur de la classe de références car les exceptions ne sont pas censé être une habitude de contrôle de flux de mécanisme, de sorte qu'il ne devrait pas s'ils sont lents. J'imagine look-up n'est pas terriblement lent de toute façon, depuis Java sans doute fait de son propre mise en cache pour ce genre de chose.
Je vais mettre un plus complète et la réponse générale qui a besoin d'un peu plus d'explications que j'ai besoin avant.
Premier est bon de mettre votre méthode avec un
Throw Exception
donc l'IDE va demander try/catch.Je décide de
IOException
surException
en raison de cette.