Manipulaci 256x256 bitmap zřítilo Android NDK je JNI

hlasů
1

Možná jsem se snaží dělat něco, co jsem neměla.

Běžím blok kódu v emulátoru. Zdá se, že (více či méně) takto: http://pastie.org/1291380

To je vytvořit živé tapety na pozadí. I projít v bitmapě, palety barev a velikosti dlaždice array.The mého bitmapy je 256 x 256. getRedPal / getGreenPal / getBluePal v podstatě dělá volání Color.red () / Color.green () / Color.blue () s cílem získat RGB komponenty objektu palety.

Smyčky supět spolu; Mám celou cestu až do bodu, kdy je hodnota j drawInC zasáhne 32, před havárií emulátoru a popálenin:

11-11 15: 34: 44,032: INFO / distort_bmp (598): DrawInC: i: 0 j: 32

11-11 15: 34: 44,032: INFO / distort_bmp (598): DrawTiles: i: 0 j: 0

11-11 15: 34: 44,032: INFO / distort_bmp (598): DrawTiles: i: 0 j: 1

11-11 15: 34: 44,032: INFO / distort_bmp (598): DrawTiles: i: 0 j: 2

11-11 15: 34: 44,032: INFO / distort_bmp (598): DrawTiles: i: 0 j: 3

11-11 15: 34: 44,032: INFO / distort_bmp (598): DrawTiles: i: 0 j: 4

Po které jsem si soubor s výpisem zaslaný / data / náhrobků. Zde je dump (ale upřímně nenajdou nic v něm stojí jakoukoliv hodnotu, jen banda paměťových adres): http://pastie.org/1291394

Přidal jsem android: vmSafeMode = „true“, aby mé značce po přečtení jinde, že by mohl vyřešit problém. To je o 2,2 s použitím bitmap.h.

Osobně jsem pochybnosti o tom

jbyte* buffer = 
(*env)->GetByteArrayElements(env, arr, &isCopy)

volání; utrhl jsem ten kód z čistého někam, když jsem byl úplně nedokáže dostat hodnoty ze svého bytového pole „arr.“

Nějaké nápady?

EDIT Po manipulaci mé smyčky iterátory (zkrátil Já počet smyček), teď jsem dostal informativní chybu:

ReferenceTable přetečení (max = 512)

JNI local reference table summary (512 entries):
  509 of Ljava/lang/Class; 164B (3 unique)
2 of Ljava/lang/String; 28B (2 unique)
   1 of [Ljava/lang/String; 28B
Memory held directly by tracked refs is 576 bytes
Failed adding to JNI local ref table (has 512 entries)

Že „509 of java.lang.class“ nevypadá moc se mi to správné ... Jak mohu optimalizovat svůj kód zde?

Položena 12/11/2010 v 17:43
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
2

Od té chybová zpráva, zdá se, že někteří trochu nativního kódu se nazývá funkci, která vrací objekt třídy, a tak učinil 509 krát. 507 z těchto výzev se vrátil jedné konkrétní třídě.

JNI místní odkazy ať GC vědět, že nativní kód se dívá na objekt, a proto tento objekt nelze odebrat, i když nejsou žádné zmínky o tom na jiném místě. Tyto místní refs jsou uvolněny, když nativní kód vrátí do virtuálního počítače. V případě, že nativní kód dělá hodně práce bez návratu, je možné přetečení Lokál tabulky.

Budete pravděpodobně stačí přidat někam DeleteLocalRef. Můj odhad je, budete muset přidat jednu na konci DrawTile, protože GetObjectClass hovoru. Nebo ještě lépe, pohybovat ty GetMethodID volání funkce setup jednorázové. (Dělají řetězec vyhledávání najít metodu, což z nich nijak zvlášť rychle.)

Pro více informací viz Tipy JNI .

Odpovězeno 12/11/2010 v 23:14
zdroj uživatelem

hlasů
0

Myslím, že to může být problém paměti. si uvolnit pole?

pokud máte pole s

(*env)->GetByteArrayElements(env, arr, &isCopy)

je třeba uvolnit matice na c-straně po každém postupu nebo vyplníte svou paměť až se dostanete nad limitní (mezní velikost závisí na verzi Android a / nebo výrobci, ale pokud vím max 48MB na aplikaci)

(*env)->ReleaseByteArrayElements(env, arr, &isCopy, 0);

viz zde: http://www.iam.ubc.ca/guides/javatut99/native1.1/implementing/array.html

btw, tato metoda dělá kopírovat pole z Javy do nového bloku paměti v jazyce C, pracovat tam, a na konci jeho zkopírování zpět do Java (což paměti by mohl být přesunut do jiného umístění do té doby). Pro zlepšení výkonu můžete prohlédnout https://groups.google.com/forum/?fromgroups#!msg/android-ndk/phDP5zqiYY4/BFMw4zTme8IJ

Odpovězeno 20/04/2012 v 15:19
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more