2011-02-10 22 views
5

Android uygulamamda, bazı verileri döndüren yerel bir yöntemden kapsamlı bir şekilde yararlanıyorum.Jni Referans Tablosu taşması

Ancak bazı aramalardan sonra bir çökme elde ediyorum.

yerli denilen yöntemdir:

static jbyteArray JNIGetIcon(JNIEnv* e, jclass clazz) 
{ 
    ByteBuffer buff; 
    buff.Write(*icon, 48, 32, r66Api::IBitmap::TEncoding::EEnc_Rgba8888); 

    jbyteArray result = GetEnv()->NewByteArray(buff.Size()); 
    GetEnv()->SetByteArrayRegion(result, 0, buff.Size(), (jbyte*) buff.GetData()); 

    return result;  
} 

birisi yanlış yapıyorum bana gösterebilir misiniz?

kilitlenme günlük geçerli:

02-10 18:33:32.075 W/dalvikvm(10644*10644): ReferenceTable overflow (max=1024) 
02-10 18:33:32.075 W/dalvikvm(10644*10644): Last 10 entries in JNI pinned array reference table: 
02-10 18:33:32.075 W/dalvikvm(10644*10644): 1014: 0x2fc77de0 cls=[C (28 bytes) 
02-10 18:33:32.075 W/dalvikvm(10644*10644): 1015: 0x2fc79b88 cls=[C (28 bytes) 
02-10 18:33:32.075 W/dalvikvm(10644*10644): 1016: 0x2fc79c38 cls=[C (28 bytes) 
02-10 18:33:32.085 W/dalvikvm(10644*10644): 1017: 0x2fc79ef8 cls=[C (28 bytes) 
02-10 18:33:32.085 W/dalvikvm(10644*10644): 1018: 0x2fc79fa8 cls=[C (28 bytes) 
02-10 18:33:32.085 W/dalvikvm(10644*10644): 1019: 0x2fc7a050 cls=[C (28 bytes) 
02-10 18:33:32.085 W/dalvikvm(10644*10644): 1020: 0x2fc7a0f0 cls=[C (28 bytes) 
02-10 18:33:32.105 W/dalvikvm(10644*10644): 1021: 0x2fc7a190 cls=[C (28 bytes) 
02-10 18:33:32.105 W/dalvikvm(10644*10644): 1022: 0x2fc7a240 cls=[C (28 bytes) 
02-10 18:33:32.105 W/dalvikvm(10644*10644): 1023: 0x2fc7a2e8 cls=[C (28 bytes) 
02-10 18:33:32.115 W/dalvikvm(10644*10644): JNI pinned array reference table summary (1024 entries): 
02-10 18:33:32.115 W/dalvikvm(10644*10644): 6 of [C 20B (5 unique) 
02-10 18:33:32.115 W/dalvikvm(10644*10644): 1013 of [C 28B (237 unique) 
02-10 18:33:32.125 W/dalvikvm(10644*10644): 2 of [C 36B (2 unique) 
02-10 18:33:32.125 W/dalvikvm(10644*10644): 1 of [C 52B 
02-10 18:33:32.125 W/dalvikvm(10644*10644): 1 of [C 68B 
02-10 18:33:32.125 W/dalvikvm(10644*10644): 1 of [C 92B 
02-10 18:33:32.125 W/dalvikvm(10644*10644): Memory held directly by native code is 7020 bytes 
02-10 18:33:32.135 E/dalvikvm(10644*10644): Failed adding to JNI pinned array ref table (1024 entries) 
02-10 18:33:32.135 I/dalvikvm(10644*10644): "main" prio=5 tid=3 RUNNABLE 
02-10 18:33:32.135 I/dalvikvm(10644*10644): | group="main" sCount=0 dsCount=0 s=N obj=0x2aaca308 self=0xbe08 
02-10 18:33:32.135 I/dalvikvm(10644*10644): | sysTid=10644 nice=0 sched=0/0 cgrp=unknown handle=1877224116 
02-10 18:33:32.135 I/dalvikvm(10644*10644): at android.graphics.Canvas.drawText(Native Method) 
02-10 18:33:32.145 I/dalvikvm(10644*10644): at android.text.BoringLayout.draw(BoringLayout.java:363) 
02-10 18:33:32.145 I/dalvikvm(10644*10644): at android.widget.TextView.onDraw(TextView.java:4052) 
02-10 18:33:32.155 I/dalvikvm(10644*10644): at android.view.View.draw(View.java:6535) 
02-10 18:33:32.155 I/dalvikvm(10644*10644): at android.view.ViewGroup.drawChild(ViewGroup.java:1531) 
02-10 18:33:32.155 I/dalvikvm(10644*10644): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258) 
02-10 18:33:32.165 I/dalvikvm(10644*10644): at android.view.View.draw(View.java:6538) 
02-10 18:33:32.165 I/dalvikvm(10644*10644): at android.view.View.buildDrawingCache(View.java:6297) 
02-10 18:33:32.165 I/dalvikvm(10644*10644): at android.view.View.getDrawingCache(View.java:6086) 
02-10 18:33:32.165 I/dalvikvm(10644*10644): at android.view.ViewGroup.drawChild(ViewGroup.java:1456) 
02-10 18:33:32.175 I/dalvikvm(10644*10644): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258) 

cevap

6

Sana yanlış işlevi bakıyoruz düşünüyorum. Günlük mesajına göre, bir grup tutturulmuş karakter dizisi ("C") var. 1013 tanesi kesin olmalı.

Eşleşen bir Sürüm içermeyen GetStringChars veya GetStringCritical aramasını arayın.

+0

Teşekkürler! . Bir çok arama çalışmasından sonra, bir yerde bir "GetStringChars()" yaptım ve "ReleaseStringChars" adlı bir kopyasını ancak bir kopya (isCopy == JNI_TRUE) ise buldum. Sadece günlüğe bakarak, nasıl anladın diye merak ettim. Neyse tekrar teşekkürler! – rantravee

+1

Alınırsanız, Kopyalama'nın ne tuttuğuna bakılmaksızın Serbest Bırakmanız gerekir (bu bir kopya değilse, GC'nin taşınmasını önlemek için orijinalin tutturulması gerekir, böylece verileri ayırmak için Serbest Bırakmanız gerekir). Bunu nasıl çözdüm: Günlük, yalnızca String ve Get ArrayElements çağrıları için geçerli olan "JNI sabitlenmiş dizi referans tablosu" yazıyor. "[C" (char dizisi) için GetStringChars işlevi en olası suçludur. – fadden

+0

Merhaba, çok benzer bir sorunum var. Zaten tüm JNI fonksiyonları olan NDK ile bir veritabanı kütüphanesi derledim. Şimdi bir kez thesis fonksiyonlarını kullanıyorum ve veritabanına veri yükleme bir süre sonra bu "ReferenceTable taşma (max = 1024)" hatası alıyorum. Sorunun nerede olduğunu nasıl bulabilirim ve bu konuda daha fazla bilgiyi nereden alabilirim. –