Ich sehe da weniger den Punkt "Was liebe ich mehr" sondern mehr eine Frage, wann nutze ich was?
JNI: Das wird halt von mir verwendet, wenn ich eigenen C / C++ Code habe und diesen einbinden muss in meine Java Anwendung. Das bringt halt einiges mit sich und ich empfand es als relativ umfangreich, was da so notwendig ist. (War aber durchaus geradlinig. Das Makefile mit den notwendigen Schritten war schnell aufgesetzt und auch der Bau des jar Files für die Java Seite liess sich schnell und einfach abbilden. War aber bei uns auf der C/C++ Seite ein Makefile und nichts moderners wie cmake oder so)
Ziel ist hier halt: Du hast Java und native Code als eine Basis und dann am Ende in einem JAR File zusammen. Sprich: Ich hatte ein C/C++ Projekt. Und das hatte dann noch einen kleinen Part mit javah Aufruf (Ab Java 9 "javac -h" aber war bei mir noch java 8) und so und dann hatte das Makefile nicht nur eine Library geliefert sondern auch noch gleich eine jar, die alles beinhaltet hat. Auch noch etwas code drumherum, so dass die Native Library aus dem jar extrahiert wurde um dann geladen zu werden und so ..
JNA: Das dient halt dazu, auf vorhandene Methoden zuzugreifen. Das kenne ich in erster Linie für die Zugriffe auf die Windows API. Hier hast Du aber halt wirklich zwei getrennte Dinge: Deine Anwendung und das, wovon Du abhängst (Also z.B. die Windows API oder so - gerade zusammen mit jna-platform). Nimmt sehr viel Aufwand und macht einem das Leben einfacher. Aber ich sehe hier halt auch die klare Trennung. Jemand stellt etwas bereit und der interessiert sich für Deine Java Ansprüche nicht.
JNR: Das ist ein interessanter Ansatz. Habe ich selbst noch nicht genutzt, daher kann ich da nicht viel zu schreiben. Was ich so gesehen habe, sieht durchaus interessant aus. Aber bisher hatte ich nur den JNI oder dann den (indirekten) JNA Ansatz.