2012-06-19 26 views
5

Tôi có một ứng dụng Android có mã gốc. Mã nguồn gốc cần có một giá trị cụ thể từ mã java; giá trị này cập nhật thường xuyên, vì vậy tôi cần phải có được nó khi tôi cần sử dụng nó. Tôi đang sử dụng JNI để thực hiện cuộc gọi từ mã nguồn gốc sang mã Java.Android: JNI ERROR (lỗi ứng dụng): tràn bảng tham chiếu cục bộ (max = 512)

std::string val; 
JNIEnv* env = JSC::Bindings::getJNIEnv(); 
jclass bridgeClass = env->FindClass("com.mypackage.MyClass"); 
jmethodID method = env->GetStaticMethodID(bridgeClass, "getVal", "()Ljava/lang/String;"); 
val = jstringToStdString(env, static_cast<jstring>(env->CallStaticObjectMethod(bridgeClass, method))); 
env->DeleteLocalRef(bridgeClass); 

tôi thực hiện cuộc gọi này rất thường xuyên (gần 100 lần một phút), và tôi đang phải đối mặt với ngoại lệ sau đây:

E/dalvikvm(1063): JNI ERROR (app bug): local reference table overflow (max=512) 
W/dalvikvm(1063): JNI local reference table (0xcc8590) dump: 
W/dalvikvm(1063): Last 10 entries (of 512): 
W/dalvikvm(1063):  511: 0x413c7e70 java.lang.String "ABC" 
W/dalvikvm(1063):  510: 0x40a39470 java.lang.Class<android.util.Log> 
W/dalvikvm(1063):  509: 0x413c8558 java.lang.String "9287391238192... (24 chars) 
W/dalvikvm(1063):  508: 0x413c8558 java.lang.String "8298731897198... (24 chars) 
W/dalvikvm(1063):  507: 0x413c8558 java.lang.String "1983918729387... (24 chars) 
W/dalvikvm(1063):  506: 0x413c8558 java.lang.String "9283719732827... (24 chars) 
W/dalvikvm(1063):  505: 0x413c8558 java.lang.String "1231219897173... (24 chars) 
W/dalvikvm(1063):  504: 0x413c8558 java.lang.String "8237330127537... (24 chars) 
W/dalvikvm(1063):  503: 0x413c8558 java.lang.String "1293657681298... (24 chars) 
W/dalvikvm(1063):  502: 0x413c8558 java.lang.String "1298753090172... (24 chars) 
W/dalvikvm(1063): Summary: 
W/dalvikvm(1063):   2 of java.lang.Class (2 unique instances) 
W/dalvikvm(1063):  510 of java.lang.String (2 unique instances) 
E/dalvikvm(1063): Failed adding to JNI local ref table (has 512 entries) 

Tất cả những câu hỏi tương tự như trên mạng có câu trả lời phổ biến mà nhiều nguồn lực cần được giải thoát. Bất cứ ai có thể cho biết những tài nguyên khác mà tôi có thể giải phóng trong trường hợp này?

Cảm ơn.

Trả lời

6

Bạn cần phải xoá ref địa phương với giá trị trả về bởi

env->CallStaticObjectMethod(bridgeClass, method) 

như sau:

jobject returnValue = env->CallStaticObjectMethod(bridgeClass, method); 
// ... 
env->DeleteLocalRef(returnValue); 
+0

Cảm ơn rất nhiều !! – Jake

+1

làm thế nào tôi có thể làm điều này? – patrick

+1

@patrick 'env-> DeleteLocalRef (returnValue);'. – Malcolm

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