2017-10-03 7 views
1

In vielen Beispiele für die Verwendung JNI, ich sehe so etwas wie:Warum wird JNI in Java im statischen Initialisierer geladen?

class SampleClass { 
    static { 
     System.loadLibrary("somelib"); 
    } 
    ... 
} 

Was ist der Zweck dieser speziellen Syntax ist? Warum benutzt man das (und nicht nur im Klassenkonstruktor oder so?)

+0

es nicht nennen würde per se spezielle Syntax. Die gesamte Initialisierung von statischen Feldern könnte unter Verwendung dieser Klasse durchgeführt werden, und es wurden Klassenloader- oder konfigurationsbasierte Szenarien gesehen, in denen dies auch verwendet wurde. Es ruft im Allgemeinen Code auf, den Sie "pro Klasse" und nicht pro Instanz möchten. –

Antwort

1

Ich denke, Sie werden die beste Antwort aus dem Buch erhalten:

Java™ Native Interface: Programmer’s Guide and Specification, The

Wo man lesen kann:

Druck

Bevor der native Methode die native Bibliothek, die implementiert Druck geladen aufgerufen werden können, werden muss. In diesem Fall wird die native Bibliothek im statischen Initialisierer der HelloWorld-Klasse geladen. Die virtuelle Java-Maschine führt automatisch den statischen Initialisierer vor , der Methoden der HelloWorld-Klasse aufruft. Dadurch wird sichergestellt, dass die native Bibliothek geladen wird, bevor die systemeigene Methode native aufgerufen wird.

Im Allgemeinen verhindert nichts, dass Sie die Bibliothek in die Methode einer Klasse laden. Methode, das ist nicht static. In diesem Fall müssen Sie jedoch sicherstellen, dass Sie die Bibliothek laden (indem Sie eine Methode aufrufen, die load oder loadLibrary aufruft), bevor Sie eine systemeigene Methode aufrufen.

Wenn Sie auch eine andere Version der Bibliothek laden möchten, ohne mit mehreren ClassLoadern zu spielen, können Sie immer Wrappercode verwenden. Auf diese Weise können Sie dynamisch zwischen systemeigenen Codeimplementierungen wechseln.

Werfen Sie einen Blick hier: dynamic loading of library in JNI

1

Es gibt keinen Grund, nicht, aber normalerweise möchten Sie native Bibliotheken nur einmal laden. Der einfachste Weg, um das zu erreichen, ist durch statische Initialisierung Sie müssen Ihren eigenen Mechanismus zu implementieren, es geschieht mehrmals zu verhindern. Siehe Is it possible to load different versions of the same DLL in Java? für Nachladen Bibliothek.

Ein weiterer Grund ist, dass Sie nicht die Bereitstellung von statischen Methoden unter Verwendung von nativen Code fähig sein würden.

Verwandte Themen