Czy muszę mieć funkcję pomocnika JNI, która wywołuje env-> NewDirectByteBuffer (bufor, rozmiar)?Czy istnieje sposób na utworzenie bezpośredniego obiektu ByteBuffer ze wskaźnika wyłącznie w języku Java?
Odpowiedz
Co mogę zrobić, to stworzyć normalny DirectByteBuffer i zmienić jego adres.
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);
Od tego momentu można uzyskać dostęp do ByteBuffer odwołującego się do adresu bazowego. Zrobiłem to dla dostępu do pamięci na kartach sieciowych dla zerowej kopii i działało dobrze.
Możesz utworzyć DirectByteBuffer dla swojego adresu bezpośrednio, ale jest to bardziej niejasne.
Alternatywą jest użycie niebezpiecznych (ten działa tylko na OpenJDK/HotSpot JVMs w natywnej kolejności bajtów)
Unsafe.getByte(address);
Unsafe.getShort(address);
Unsafe.getInt(address);
Unsafe.getLong(address);
Świetna odpowiedź, jednak musiałem ją zhakować, aby działało, szczególnie Field address = Buffer.class.getDeclaredField ("address"). – Erik
@Erik dziękuję za korektę. –
Oto więc kontynuacja pierwotnego pytania, ponieważ wciąż zwracasz uwagę. Jaki jest najlepszy sposób na wyczyszczenie pamięci dołączonej do ByteBuffer w ten sposób? Czy ByteBuffer sfinalizuje bezpłatny adres, czy powinien zadzwonić internauci i wyczyścić alokację? Dla celów tego pytania załóżmy, że napisałem bibliotekę JNI z owijkami wokół malloc i wolnymi :) Prawdopodobnie zasługuje na to własne pytanie, teraz, gdy myślałem o tym więcej. – Erik
- 1. Czy istnieje szybki sposób na utworzenie zestawu?
- 2. Czy istnieje prosty sposób na uzyskanie rozmiaru obiektu java?
- 3. Najprostszy sposób na utworzenie strumienia z obiektu Java?
- 4. Używanie JRuby do bezpośredniego wywoływania metod Java w języku Java
- 5. Android: Czy istnieje dobry sposób na utworzenie okna dialogowego Toast?
- 6. Czy istnieje sposób na utworzenie instancji typu z danymi testowymi?
- 7. Czy istnieje sposób na utworzenie tła tła za pomocą CSS?
- 8. Czy w języku Java istnieje odpowiednik epollu?
- 9. Czy w java można mieć niepodpisany ByteBuffer?
- 10. Jaki jest "poprawny" sposób przechowywania natywnego wskaźnika wewnątrz obiektu Java?
- 11. Czy istnieje sposób na zawinięcie bloku ObjectiveC do wskaźnika funkcji?
- 12. Utworzenie refaktora listy ze strumieniami java 8
- 13. Czy istnieje odpowiednik frexp w języku Java?
- 14. Java/Android - Szybka analiza ByteBuffer
- 15. C++ odpowiednik Java ByteBuffer?
- 16. Czy istnieje sposób na ponowne wykorzystanie Stream w java 8?
- 17. Czy istnieje wskaźnik do wskaźnika do wskaźnika?
- 18. Czy istnieje sposób na znalezienie ID Teamviewer w języku C#?
- 19. Czy istnieje przenośny sposób kopiowania bloku pamięci w języku C#?
- 20. W Perlu, czy istnieje sposób na powiązanie ze skrytką?
- 21. Czy istnieje sposób na utworzenie jednego obrazu Gif z wielu obrazów w Javie?
- 22. Problem z wydajnością Java ByteBuffer
- 23. Czy istnieje lista klas bezpiecznych dla wątków w języku Java?
- 24. W języku Java, czy istnieje szybki sposób, aby zrzucić wszystkie argumenty do metody?
- 25. Czy istnieje sposób na zamaskowane pole liczbowe?
- 26. Jak uzyskać nazwę funkcji ze wskaźnika funkcji w języku C#?
- 27. Czy istnieje łatwiejszy sposób na utworzenie dostawcy danych usługi danych WCF/OData?
- 28. Sposób przechwytywania obrazu ekranowego za pomocą wskaźnika myszy na nim w języku Java
- 29. Czy istnieje bardziej elegancki sposób konwersji dokumentu XML na ciąg w języku Java niż ten kod?
- 30. Czy istnieje prosty sposób przekonwertowania ciągu znaków na inetadres w języku Java?
Pan spojrzał na sun.misc.unsafe? Pozwala na bezpośrednią interakcję z pamięcią. – assylias
Zerknąłem i nie widziałem sposobu na utworzenie bezpośredniego bufora bajtowego z sun.misc.unsafe. Znalazłem sposób na stworzenie DirectByteBuffer i to poprzez odbicie. Użyj java.lang.Class.getDeclaredConstructor, aby utworzyć obiekt Constructor, setAccessable na wartość true i wywołaj newInstance z odpowiednimi parametrami. Trochę jane, ale nie musisz pisać kodu JNI. –