2012-10-02 12 views
5

में जोड़ने में विफल रहा मैंने जावा से एक बहुआयामी सरणी की प्रतिलिपि बनाई, लेकिन मुझे इसका उपयोग करने के बाद स्मृति मुक्त करने में कुछ समस्याएं आ रही हैं।जेएनआई पिन किए गए सरणी रेफ तालिका (1024 प्रविष्टियों)

मैं क्या किया है:

jfieldID h_valID = (*env)->GetFieldID(env, h_cls, "val", "[[I"); 
jobjectArray h_val_obj = (*env)->GetObjectField(env, h, h_valID); 
int h_val_local[xdim][ydim]; 
for(i=0; i<xdim; i++) 
{ 
    h_val_one_dim = (jintArray) (*env)->GetObjectArrayElement(env, h_val_obj, i); 
    h_val_elem = (*env)->GetIntArrayElements(env, h_val_one_dim, 0); 
    for(j=0; j<ydim; j++) 
    { 
     h_val_local[i][j] = h_val_elem[j]; 
    } 
    (*env)->ReleaseIntArrayElements(env, h_val_one_dim, h_val_elem, 0); 
    (*env)->DeleteLocalRef(env, h_val_one_dim); 
} 
(*env)->DeleteLocalRef(env, h_val_obj); 

मुझे लगता है कि विधि पर 4 अधिक सरणियों है, मानकों के आधार पर सभी, मैं सूचक हो रही है तो यह उपयोग करने के बाद रिलीज़ किया था।

int *x = (*env)->GetIntArrayElements(env,x_p,0); 
int *y = (*env)->GetIntArrayElements(env,y_p,0); 
int *v = (*env)->GetIntArrayElements(env,v_p,0); 
int *w = (*env)->GetIntArrayElements(env,w_p,0); 

...

(*env)->ReleaseIntArrayElements(env, x_p, x, 0); 
(*env)->ReleaseIntArrayElements(env, y_p, y, 0); 
(*env)->ReleaseIntArrayElements(env, v_p, v, 0); 
(*env)->ReleaseIntArrayElements(env, w_p, w, 0); 

बड़ा फ़ाइलों के लिए, मैं संदर्भ मेज पर अतिप्रवाह हो रही है। मैं क्या मुक्त करना भूल रहा हूं या मैं इसे कैसे ठीक करूं?

प्रवेश करें:

10-02 14: 18: 58.885: डब्ल्यू/dalvikvm (23,598): ReferenceTable अतिप्रवाह (अधिकतम = 1024)

10-02 14: 18: 58.885: डब्ल्यू/dalvikvm (23,598): JNI पिन किए गए सरणी संदर्भ तालिका में पिछले 10 प्रविष्टियों:

10-02 14: 18: 58.885: डब्ल्यू/dalvikvm (23,598): 1014: 0x46109fe8 cls = [मैं (24 बाइट्स)

10-02 14: 18: 58.885: डब्ल्यू/दल्विकविक (235 9 8): 1015: 0x4610a008 cls = [I (24 बाइट्स)

10-02 14: 18: 58.885: डब्ल्यू/dalvikvm (23,598): 1016: 0x46109fa8 cls = [मैं (24 बाइट्स)

10-02 14: 18: 58.885: डब्ल्यू/dalvikvm (23,598) : 1017: 0x46109fc8 cls = [मैं (24 बाइट्स)

10-02 14: 18: 58.885: डब्ल्यू/dalvikvm (23,598): 1018: 0x46109fe8 cls = [मैं (24 बाइट्स)

10-02 14: 18: 58.885: डब्ल्यू/दल्विकवीएम (235 9 8): 101 9: 0x4610a008 सीएलएस = [आई (24 बाइट्स)

10-02 14: 18.88.885: डब्ल्यू/दल्विकविक (23598): 1020: 0x46109fa8 cls = [ मैं (24 बाइट्स)

10-02 14: 18: 58.885: डब्ल्यू/dalvikvm (23,598): 1021: 0x46109fc8 cls = [मैं (24 बाइट्स)

10-02 14: 18: 58.885: डब्ल्यू/dalvikvm (23,598): 1022: 0x46109fe8 cls = [मैं (24 बाइट्स)

10-02 14: 18: 58.885: डब्ल्यू/dalvikvm (23,598): 1023: 0x4610a008 cls = [मैं (24 बाइट्स)

10-02 14 : 18: 58.885: डब्ल्यू/दल्विकविक (235 9 8): जेएनआई पिन एरे संदर्भ तालिका सारांश (1024 प्रविष्टियां):

10-02 14: 18.8885: डब्ल्यू/दल्विकविक (23598): 1024 [I 24B (4 अद्वितीय)

10-02 14: 18: 58.885: डब्ल्यू/dalvikvm (23,598): ट्रैक किए गए refs द्वारा सीधे तौर पर आयोजित स्मृति 96 बाइट्स

10-02 14:18:58 है।885: ई/dalvikvm (23,598): JNI पिन किए गए सरणी रेफरी तालिका (1024 प्रविष्टियों)

THX

उत्तर

5

मुझे पता चला कि मैं क्या गलत कर रहा था, बेहतर, मैं क्या करना भूल गया। मेरे पास कोड में एक और रिटर्न पॉइंट है, लेकिन मैं उस मामले में लौटने से पहले सरणी को छोड़ना भूल गया था, मैं इसे केवल फ़ंक्शन के अंत में रिलीज़ कर रहा था।

1

मेरे लिए JNI कार्यान्वयन में एक बग की तरह लग रहा करने के लिए जोड़ना विफल रहा। एक स्पष्ट कामकाज इसके बजाय एक-आयामी सरणी का उपयोग करना है। सरणी जावा पक्ष पर जंजीर नहीं है, ऐसा लगता है, इसलिए यह पीछे और आगे परिवर्तित करने के लिए बहुत सरल होगा। 1 डी सरणी में तत्व (i,j) की अनुक्रमणिका i*xdim + j होगी।

+0

आपके उत्तर के लिए धन्यवाद, लेकिन मुझे पता चला कि समस्या उस भाग में नहीं थी जिसे मैंने ऊपर पोस्ट किया था। – Deadlock

संबंधित मुद्दे