2011-12-17 8 views

Odpowiedz

7

Jak już zauważył Peter Lawrey, używanie obiektu innego niż Java nie jest możliwe, jednak możliwe jest bezpośrednie malowanie surowych danych z prostej tablicy bajtów Javy (dostęp do niej można uzyskać bezpośrednio po stronie C++).

Na koniec można nawet zadzwonić pod numer Canvas.drawBitmap(..), używając tej tablicy bajtów do namalowania utworzonego obrazu. Oczywiście to wymaga przechowywania obrazu na stronie C++ bezpośrednio w wymaganym formacie wewnątrz tablicy bajtów.

Java:

byte[] pixelBuf = new byte[bufSize]; 

następnie przekazać odwołanie do natywnej implementacji C++ byte[]. Na C++ stronie można nazwać

C++:

jbyte* pixelBufPtr = env->GetByteArrayElements(pixelBuf, JNI_FALSE); 
jsize pixelBufLen = env->GetArrayLength(env, pixelBuf); 
// modify the data at pixelBufPtr with C++ functions 
env->ReleaseByteArrayElements(pixelBuf, pixelBufPtr, 0); 
+0

Dziękuję za odpowiedź. Czy dobrze rozumiem, że tablica bajtów musi zostać całkowicie utworzona w języku Java, a następnie można uzyskać do niej dostęp i zmienić ją tylko w języku C++? – HardCoder

+0

Tak, musisz utworzyć tablicę bajtów w Javie. Po stronie C++ można "zablokować" dane do uzyskania wskaźnika. Po odblokowaniu możesz go również użyć i zmienić w Javie. Zobacz moją zaktualizowaną odpowiedź. – Robert

+0

"pixelBuf" jest typu "jbyteArray" .. – AnkitRox

1

Możesz spróbować użyć bezpośredniego ByteBuffera. ByteBuffer odwołuje się do natywnego obszaru pamięci. Jednak aby użyć obrazu w Javie, musi on znajdować się w obiekcie Java. Możesz zmontować ten obiekt w Javie lub C, ale nie widzę sposobu, w jaki można uniknąć kopiowania obrazu, chyba że twoja biblioteka C zapisuje obraz jako strukturę Java.

+0

Dzięki za odpowiedź. Moim celem jest przydzielenie map bitowych poza pamięć sterty Java, co oznacza, że ​​musi być przydzielona w języku C++. Czy jest jakiś sposób, aby to osiągnąć za pomocą bufora bajtowego? – HardCoder

+0

Możesz zmienić pole adresu ByteBuffer do punktu, w którym zawsze chcesz od JNI (lub odbicia) –

+0

Jeszcze raz dziękuję, spróbuję tego! – HardCoder

0

miałem ten sam problem i moje rozwiązanie było przeznaczyć ogromny bufor w C++, a następnie narysować każdy żądany „Widok” w mapie bitowej Javy. Używam "nowych" funkcji bitmapowych NDK, które pojawiły się w systemie Android 2.2; umożliwiają bezpośredni dostęp do bitmap bitów. Może nie być idealny do użytku, ale unika kopiowania bitmap i pozwala tworzyć mapy bitowe tak duże, jak wolna pamięć. Tworzę mapę bitową wielkości okna wyświetlacza, a następnie rysuję skalowane widoki z dużej bitmapy do niej za pomocą mojego własnego skalowania kodu natywnego.

+0

BitBank: czy otrzymałeś kod rysowania bitmapy z próbki online? Jeśli tak, czy mógłbyś dodać do niego link? – kenyee

+0

Kod rysowania bitmapy jest moim własnym (ARM asm) i wolałbym go nie publikować. – BitBank

Powiązane problemy