2017-05-26 3 views
3

Auf JNI-Spezifikation zur Verfügung zu stellen wirklich Zeiger benötigen Schnittstelle, heißt es:Hat JNI mehrere Versionen von JNI Funktionstabellen

Die JNI-Schnittstelle wie eine C++ organisiert virtuelle Funktionstabelle oder eine COM-Schnittstelle. Der Vorteil der Verwendung einer Schnittstellentabelle anstelle von festverdrahteten Funktionseinträgen besteht darin, dass der JNI-Namespace vom systemeigenen Code getrennt wird. Eine VM kann problemlos mehrere Versionen von JNI-Funktionstabellen bereitstellen. Zum Beispiel kann die VM zwei JNI-Funktionstabellen unterstützen:

man führt gründliche unzulässige Argumentprüfungen durch und ist zum Debuggen geeignet; der andere führt die minimale Menge an Prüfungen durch, die von der JNI-Spezifikation benötigt wird und ist daher effizienter.

Aber ist es wirklich nötig? Immerhin ist der Schnittstellenzeiger Zeiger auf Zeiger. Es kostet mehr Leistungsrezession.

+0

Verglichen mit dem Aufwand beim Überqueren der JVM/JNI-Grenze und dem Ausführen eines JNI-Funktionsaufrufs ist die zusätzliche Indirektion völlig unbedeutend. – EJP

Antwort

2

Nein, sie (Sun) hätten sich ein anderes Design ausdenken können. Dieses JniEnv ist aus historischen Gründen bei uns und trägt zu JNI-Overhead bei, wenn auch nicht signifikant.

Die Idee war es, Java-Seite zu steuern, ob die Debugging-Funktionen zur Laufzeit pro Thread verwendet werden. Ich glaube nicht, dass diese Idee jemals jemandem geholfen hat, ihren Code zu debuggen.

Beachten Sie, dass der C++ - Wrapper den Aufwand erheblich reduziert (sicher, das ist nur Syntax; der Overhead geht nicht).