Question

Je suis développeur java depuis quelques années et j'ai entendu dire que vous pouvez faire des choses utiles et puissantes avec JNI. Je ne sais pas si je n'ai tout simplement pas eu besoin de l'utiliser ou si ce n'est pas très pertinent pour moi; mais je n'ai pas eu à le toucher du tout.

Je me demande quelle est l'utilité de cet aspect de Java. Des exemples seraient géniaux.

Était-ce utile?

La solution

C'est très utile. Je peux voir deux raisons principales d’utiliser JNI (il y en a probablement plus).

  1. Performance. Si vous avez un élément de code dans lequel Java Runtime, quelle qu'en soit la raison, ne peut en réduire les performances. Vous pouvez implémenter cette fonction en code natif et l'appeler depuis Java. Cela vous permet d’ajuster manuellement l’implémentation si vous en avez besoin . C’est probablement la raison la moins courante, mais Java fonctionne généralement très bien.

  2. Accès aux API spécifiques au système d'exploitation. Celui-ci est un gros. J'ai eu un cas où je devais faire quelque chose en Java mais j'avais également besoin d'accéder à quelque chose que Java ne pouvait tout simplement pas fournir. Dans mon cas, c’était des sockets de domaine UNIX. Comme (comme vous pouvez le constater par leur nom), ils sont spécifiques à UNIX, il n’existe pas de méthode Java standard pour les utiliser. J'ai donc créé un cours qui agit comme une enveloppe autour de C et auquel j'ai accédé avec JNI. Alto, problème résolu.

Autres conseils

J'ai écrit une couche JNI complète pour que l'iSeries puisse accéder à DB2, aux files d'attente d'utilisateurs, aux files d'attente de données et à quelques autres spécificités OS / 400. Une grande partie de notre système sur la série iSeries aurait été impossible sans JNI. Donc, oui, JNI a sa place, et quand vous en avez besoin, vous en avez vraiment besoin.

C'est relativement difficile (à côté de Java pur), mais puissant et pas horrible.

De plus, chaque fois que je consulte un code JNI, je pense également à utiliser la JNA .

Je peux penser à quelques utilisations spontanées:

  1. intégration avec le bas niveau existant (C / C ++) API sans Java contrepartie
  2. intégration aux aspects du système qui ne sont pas exposés via les API Java disponibles (direct accès au matériel, etc.)

Certains diront peut-être que cela peut être utile pour créer des sections de code hautement optimisées. Toutefois, avec les machines JVM modernes, les progrès sont rapides et les complications liées à l'utilisation de JNI l'emporteraient probablement sur les avantages en termes de performances que vous pourriez voir.

Il existe quelques utilisations possibles pour la liaison à FFMPeg pour le décodage en C du format vidéo / audio (ou presque).

Il y a aussi la JNA, ce qui la rend comme si vous utilisiez la bibliothèque elle-même. C'est " plus facile " du point de vue qu'il incombe au développeur Java de tout gérer, et plus difficile dans le sens où vous devez comprendre le mappage de la structure et faire beaucoup de travail pour obtenir que tous les pointeurs, etc., passent correctement.

Nous devions intégrer une nouvelle interface utilisateur à une application C héritée fonctionnant sous Suse Linux. JNI était l'outil idéal pour le travail.

En général, jNI est une contradiction avec la notion Java "Write Once, Run Anywhere". Cependant, il existe des cas d'utilisation où JNI peut être utile.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top