Ich möchte die Adressen von Java-Objekten (insbesondere Byte-Arrays) an Systemaufrufe und externe Funktionen übergeben, die innerhalb eines JNI-Aufrufs zurückgeben.Ist direkter Puffer für JNI/externe Bibliotheksaufrufe erforderlich?
Die Antwort von OpenJDK eigenen JNI-Funktionen ist offenbar keine - zum Beispiel der readbytes/writebytes io_util von Datei-Streams verwendete immer einen direkten Puffer/Heap für externe Anrufe im Zusammenhang etwas von malloc einzuführen.
Aber warum? Ich überprüfte den Code in java.nio.Bits (copyFromArray) und sun.misc.Unsafe (copyMemory), und es ist sehr klar, dass der Inhalt von primitiven Java-Arrays direkt in gewöhnlichem C-Code ohne irgendeine spezielle Behandlung (wie das Benachrichtigen) zugegriffen werden kann VM für Memory-Pinning oder Umgang mit nicht-kontinuierlichen Blöcken), solange es sich im Rahmen der aktuellen JNI-Funktion befindet. Es scheint also GC kann nicht passieren, wenn eine JNI-Methode aufgerufen wird, aber wenn das stimmt, warum readBytes/writeBytes immer eine Kopie der Daten in C-Heap erstellen?
Jeder mit Erfahrung darin? Ich suche keinen offiziellen Rat/Empfehlung von OpenJDK oder Oracle. Kein Interesse an Portabilität oder irgendetwas jenseits der aktuellen Implementierungen.
mehrere einfache Tests zeigen, es funktioniert gut, aber ich habe immer noch keine Ahnung, ob es irgendeine Nebenwirkung wäre. – AqD