Oppure devo avere una funzione helper JNI che chiama env-> NewDirectByteBuffer (buffer, size)?C'è un modo per creare un ByteBuffer diretto da un puntatore esclusivamente in Java?
risposta
Quello che faccio è creare un normale DirectByteBuffer e cambiarne l'indirizzo.
Field address = Buffer.class.getDeclaredField("address");
address.setAccessible(true);
Field capacity = Buffer.class.getDeclaredField("capacity");
capacity.setAccessible(true);
ByteBuffer bb = ByteBuffer.allocateDirect(0).order(ByteOrder.nativeOrder());
address.setLong(bb, addressYouWantToSet);
capacity.setInt(bb, theSizeOf);
Da questo punto è possibile accedere al ByteBuffer riferimento all'indirizzo sottostante. Ho fatto questo per accedere alla memoria su adattatori di rete per la copia zero e ha funzionato bene.
È possibile creare direttamente un DirectByteBuffer per l'indirizzo, ma questo è più oscuro.
Un'alternativa è quella di utilizzare non sicuri (questo funziona solo su OpenJDK/Hotspot JVM e in ordine di byte nativo)
Unsafe.getByte(address);
Unsafe.getShort(address);
Unsafe.getInt(address);
Unsafe.getLong(address);
Ottima risposta, tuttavia ho dovuto lavorarci sopra per farlo funzionare, in particolare Field address = Buffer.class.getDeclaredField ("address"). – Erik
@Erik grazie per la correzione. –
Quindi ecco un seguito alla domanda originale poiché stai ancora prestando attenzione. Qual è il modo migliore per ripulire la memoria collegata al ByteBuffer in questo modo? Il ByteBuffer completerà l'indirizzo gratuito o il chiamante dovrebbe intervenire e ripulire l'allocazione? Ai fini di questa domanda, supponiamo di aver scritto una libreria JNI con wrapper attorno a malloc e gratis :) Probabilmente merita la sua stessa domanda ora che ci ho pensato di più. – Erik
- 1. Ottieni il puntatore di un ByteBuffer Java anche se JNI
- 2. Quando vorrei creare un puntatore condiviso da un puntatore raw
- 3. Cancellazione di un ByteBuffer
- 4. Utilizzo di sun.misc.Unsafe, qual è il modo più veloce per eseguire la scansione di byte da un ByteBuffer diretto?
- 5. Come inserire dati da un OutputStream in ByteBuffer?
- 6. trasferimento di byte da un ByteBuffer a un altro
- 7. Come posso utilizzare Generics per creare un modo per creare un oggetto IEnumerable da un enum?
- 8. C'è un modo per creare un tag annotato da GitHub?
- 9. Come posso ottenere un abbreviazione [] da un ByteBuffer
- 10. puntatore ad un intero in Java
- 11. c'è un modo in java per creare uno schema xsd?
- 12. Il modo migliore per creare un collage (in Java)
- 13. È possibile avere un ByteBuffer non firmato in java?
- 14. Come ottenere "ID progetto" per creare un collegamento diretto?
- 15. Manipolazione di ByteBuffer da JNI
- 16. C'è un modo semplice per creare un InputStream Java composto da diversi file aggiunti?
- 17. equivalente in C++ di Java ByteBuffer?
- 18. Staccare un puntatore da un shared_ptr?
- 19. Un modo per ottenere una classe Java da un tag o un simbolo di Scala (2.10)?
- 20. Proteggere file PHP da un accesso diretto
- 21. Access Database già aperto esclusivamente da un altro utente
- 22. Flash - Come creare esclusivamente per ipad?
- 23. Come inserire il contenuto di un ByteBuffer in un OutputStream?
- 24. Come creare in modo conciso un documento XML in Java?
- 25. Java ByteBuffer a String
- 26. Come creare un JAR da .java
- 27. Può esserci un puntatore a un puntatore a un puntatore?
- 28. C'è un modo per creare un oggetto anonimo in PHP
- 29. Come creare un flusso Java 8 da un iteratore?
- 30. Come creare un array SQL da un elenco Java?
Hai guardato sun.misc.unsafe? Ti permette di interagire direttamente con la memoria. – assylias
Ho dato un'occhiata e non ho visto un modo per creare un buffer di byte diretto con sun.misc.unsafe. Ho trovato un modo per creare un DirectByteBuffer ed è attraverso la riflessione. Utilizzare java.lang.Class.getDeclaredConstructor per creare un oggetto Constructor, setAccessable su true e chiamare newInstance con i parametri appropriati. Piccolo janky ma non devi scrivere alcun codice JNI. –