2012-02-21 31 views
11

Tôi hơi bị kẹt với cái này ... Lỗi tràn tham chiếu (max = 512), tôi chắc chắn nó phải làm với Số lượng tham chiếu cục bộ được tạo trong phương pháp gốc của tôi gọi ... Để khắc phục sự cố, tôi thậm chí đã cố xóa các tham chiếu cục bộ khỏi cuộc gọi gốc; nhưng tôi vẫn không thể giải quyết vấn đề ... Tôi đang đi qua một mảng 2D; đó là approaximately 1024 X 1024 ...Lỗi tràn tham chiếu (tối đa = 512) JNI

Đây là lỗi theo dõi tôi đang đề cập đến ... Tôi chắc chắn rằng số lượng các đối tượng Integer được tạo ra gây ra vấn đề cho trường hợp của tôi ... như bạn sẽ có thể để xem 506 (I) Đối tượng được tạo ra ... Và sau đó JNI lượt truy cập các nút cổ chai ...

/dalvikvm(9498): GC_CONCURRENT freed 1981K, 41% free 6891K/11527K, external 1625K/2137K, paused 2ms+3ms 
/dalvikvm(9498): ReferenceTable overflow (max=512) 
/dalvikvm(9498): Last 10 entries in JNI local reference table: 
/dalvikvm(9498): 502: 0x40710920 cls=[I (4092 bytes) 
/dalvikvm(9498): 503: 0x40711920 cls=[I (4092 bytes) 
/dalvikvm(9498): 504: 0x40712920 cls=[I (4092 bytes) 
/dalvikvm(9498): 505: 0x40713920 cls=[I (4092 bytes) 
/dalvikvm(9498): 506: 0x40714920 cls=[I (4092 bytes) 
/dalvikvm(9498): 507: 0x40715920 cls=[I (4092 bytes) 
/dalvikvm(9498): 508: 0x40716920 cls=[I (4092 bytes) 
/dalvikvm(9498): 509: 0x40717920 cls=[I (4092 bytes) 
/dalvikvm(9498): 510: 0x40718920 cls=[I (4092 bytes) 
/dalvikvm(9498): 511: 0x40719920 cls=[I (4092 bytes) 
/dalvikvm(9498): JNI local reference table summary (512 entries): 
/dalvikvm(9498):  1 of Ljava/lang/Class; 236B 
/dalvikvm(9498):  1 of Ljava/lang/Class; 284B 
/dalvikvm(9498):  1 of Ljava/lang/Class; 572B 
/dalvikvm(9498):  2 of Ljava/lang/String; 28B (2 unique) 
/dalvikvm(9498): 506 of [I 4092B (506 unique) 
/dalvikvm(9498):  1 of [Ljava/lang/String; 28B 
/dalvikvm(9498): Memory held directly by tracked refs is 2071728 bytes 
/dalvikvm(9498): Failed adding to JNI local ref table (has 512 entries) 
/dalvikvm(9498): "main" prio=5 tid=1 RUNNABLE 
/dalvikvm(9498): | group="main" sCount=0 dsCount=0 obj=0x4001f198 self=0xce60 
/dalvikvm(9498): | sysTid=9498 nice=0 sched=0/0 cgrp=default handle=-1345006528 
/dalvikvm(9498): | schedstat=(6990020745 1042358411 1629) 
/dalvikvm(9498): at pv.ndk.UcMobile.losInitialization(Native Method) 
/dalvikvm(9498): at pv.ndk.NdkActivity.onCreate(NdkActivity.java:69) 
/dalvikvm(9498): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
/dalvikvm(9498): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611) 

đây là mã tôi đang sử dụng: Xin vui lòng cho tôi biết nó là gì mà tôi đang làm sai?

JNIEXPORT jboolean JNICALL Java_pv_ndk_UcMobile_losInitialization 
    (JNIEnv * env, jobject jobj , jint height, jint width , jobjectArray elements){ 

    elevData = new unsigned int*[height]; 

for(i=0; i< height; i++) { 
    elevData[i] = new unsigned int[width]; 

    jintArray oneDim= 
    (jintArray)env->GetObjectArrayElement(
         elements, i); 
    jint *element=env->GetIntArrayElements(oneDim, 0); 
    for(j=0; j< width; j++) { 
     elevData[i][j]= element[j]; 
    } 
    // This does not seem to be providing with the desired result 
    // env->DeleteLocalRef(element); 

    //I even tried with this approach 
    env->ReleaseIntArrayElements(oneDim, element , 0); 

    } 

return losObject.Init(elevData,1,10,2,2); 
} 

Trả lời

5

Bạn cần phải xóa tài liệu tham khảo địa phương từ oneDim đối tượng: env->DeleteLocalRef(oneDim);.

+0

giải pháp đã giúp tôi tạo thêm đối tượng ... nhưng có thể nó đã tạo ra một vấn đề khác cho gói ứng dụng của tôi (pv.ndk) - tôi hy vọng họ không liên quan .. chỉ sau VM này mà không có bất kỳ thông báo lỗi nào D/bán hàng tự động (18272): [11] LocalAssetCache.updateOnePackage(): Không có thông tin địa phương cho pv.ndk – Pranav

+0

Hmm, điều đó thật lạ. Bạn đã đặt 'DeleteLocalRef()' sau 'ReleaseIntArrayElements()', phải không? – beetoom

+0

chỉ muốn chắc chắn về điều này, tôi có cần phải đặt cả hai? hiện tại tôi đang sử dụng chỉ DeleteLocalRef [nguyên nhân tôi đang đạt đến giới hạn 512 bảng tham chiếu cục bộ] Tôi đã bị ấn tượng vì tôi cần sử dụng hoặc DeleteLocalRef hoặc ReleaseIntArrayElements; và cả hai đều phục vụ cùng một mục đích theo một cách khác. – Pranav

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