2011-02-10 30 views
5

Trong ứng dụng Android của tôi, tôi sử dụng rộng rãi phương pháp gốc trả về một số dữ liệu.Bảng tham chiếu tràn Jni

Tuy nhiên sau một số cuộc gọi, tôi nhận được sự cố.

Các gọi là phương pháp có nguồn gốc là:

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;  
} 

Có thể ai đó chỉ cho tôi những gì tôi đang làm sai?

nhật ký sự cố là:

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) 

Trả lời

6

Tôi nghĩ rằng bạn đang nhìn vào chức năng sai. Theo thông điệp tường trình bạn đã có một bó toàn bộ các mảng ký tự được ghim ("[C"). 1013 trong số đó là chính xác.

Tìm kiếm cuộc gọi GetStringChars hoặc GetStringCritical không có Bản phát hành phù hợp.

+0

Cảm ơn! . Sau rất nhiều công việc tìm kiếm tôi thấy rằng thực sự một nơi nào đó tôi đã làm một "GetStringChars()" và tôi gọi là "ReleaseStringChars" chỉ khi nó là một bản sao (isCopy == JNI_TRUE). Tôi thực sự curios làm thế nào bạn đã tìm ra nó, chỉ bằng cách nhìn vào nhật ký. Dù sao một lần nữa cảm ơn! – rantravee

+1

Nếu bạn nhận được, bạn phải phát hành, bất kể những gì isCopy giữ (nếu nó không phải là một bản sao, sau đó bản gốc phải được ghim xuống để ngăn chặn GC di chuyển nó, vì vậy bạn phải phát hành nó để bỏ ghim dữ liệu). Làm thế nào tôi figured it out: nhật ký nói "JNI pinned mảng tham chiếu bảng", mà chỉ áp dụng cho các cuộc gọi String và Nhận ArrayElements. Đối với "[C" (mảng char), hàm GetStringChars là thủ phạm có khả năng nhất. – fadden

+0

Xin chào, tôi có một vấn đề rất giống nhau. Tôi đã biên soạn một thư viện cơ sở dữ liệu với NDK đã có tất cả các chức năng JNI. Bây giờ tôi đang sử dụng một số chức năng đề tài và sau một thời gian tải dữ liệu vào cơ sở dữ liệu tôi nhận được điều này "lỗi tràn tham chiếu (max = 1024)" lỗi. Làm thế nào tôi có thể tìm ra nơi xảy ra sự cố và tôi có thể lấy thêm thông tin về vấn đề này ở đâu. –

Các vấn đề liên quan