2012-12-26 1 views
0

J'ai une implémentation de WallpaperService.Engine qui utilise JNI pour créer un C++ renderer:Android JNI: comment implémenter un objet C++ créé et supprimé avec mon objet Java?

Engine (Java) -> Renderer (C++)

Si le moteur de rendu était le code Java je pourrais simplement dire

private Renderer renderer = new Renderer(); 

pour vous assurer que le moteur de rendu a été créé avec mon moteur et détruit automatiquement quand il n'est plus nécessaire. Alors, quelle est la façon la plus propre de le faire?

P.S .: Je pensais:

int rendererId = createNativeRenderer(); 
... 
draw(rendererId); // call all native renderer methods specifying the object id 
... 
deleteNativeRenderer(rendererId); 

Mais ce n'est pas très élégant car il nécessite la suppression explicite, ce qui est facile d'oublier.

Répondre

0

Oui, ce n'est pas très élégant, mais c'est de loin le moyen le plus fiable. Java essaie d'être un marteau pour chaque ongle, donc il y a cette chose appelée finalizer - une méthode Object appelée garbage collecter votre instance. Donc, il idéalement fait exactement ce dont vous avez besoin, mais pratiquement mieux être évité. Si vous lisez attentivement the related Javadoc, vous trouverez que:

  • Votre précieux code de suppression renderer sera pas appelé lorsque vous ou votre code pense qu'il est approprié, mais lorsque le moteur de comptage de référence décide. Et pire encore, pas à ce moment précis, mais à tout moment plus tard.
  • Vous ne pouvez pas savoir et vous ne pouvez pas influencer, quel thread appellera le finaliseur. Un coup de double barillet dans le pied si le code est lié aux opérations de l'interface utilisateur (je comprends que votre code est). Cependant, vous pouvez utiliser le finaliseur pour effectuer un contrôle de sécurité.

  1. envelopper le cycle de vie du moteur de rendu (création/utilisation/supprimer) dans un objet avec la méthode du public pour la suppression
  2. sur la suppression explicite, définir un indicateur interne
  3. override finalize() et vérifier l'état du drapeau là. S'il n'est pas marqué comme supprimé, notez erreur méchante
Questions connexes