我从java复制了一个多维数组,但是在使用它之后我有一些问题需要释放内存。
我所做的是:
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:W / dalvikvm(23598):ReferenceTable溢出(最大= 1024)
10-02 14:18:58.885:W / dalvikvm(23598):JNI固定数组参考表中的最后10个条目:
10-02 14:18:58.885:W / dalvikvm(23598):1014:0x46109fe8 cls = [I(24 bytes)
10-02 14:18:58.885:W / dalvikvm(23598):1015:0x4610a008 cls = [I(24 bytes)
10-02 14:18:58.885:W / dalvikvm(23598):1016:0x46109fa8 cls = [I(24 bytes)
10-02 14:18:58.885:W / dalvikvm(23598):1017:0x46109fc8 cls = [I(24 bytes)
10-02 14:18:58.885:W / dalvikvm(23598):1018:0x46109fe8 cls = [I(24 bytes)
10-02 14:18:58.885:W / dalvikvm(23598):1019:0x4610a008 cls = [I(24 bytes)
10-02 14:18:58.885:W / dalvikvm(23598):1020:0x46109fa8 cls = [I(24 bytes)
10-02 14:18:58.885:W / dalvikvm(23598):1021:0x46109fc8 cls = [I(24 bytes)
10-02 14:18:58.885:W / dalvikvm(23598):1022:0x46109fe8 cls = [I(24 bytes)
10-02 14:18:58.885:W / dalvikvm(23598):1023:0x4610a008 cls = [I(24 bytes)
10-02 14:18:58.885:W / dalvikvm(23598):JNI固定数组参考表摘要(1024个条目):
10-02 14:18:58.885:W / dalvikvm(23598):1024 [I 24B(4独特)
10-02 14:18:58.885:W / dalvikvm(23598):跟踪引用直接持有的内存为96字节
10-02 14:18:58.885:E / dalvikvm(23598):无法添加到JNI固定数组引用表(1024个条目)
THX
答案 0 :(得分:5)
我发现了我做错了什么,更好,我忘了做什么。我在代码中有另一个返回点,但我忘了在返回之前释放数组,在这种情况下,我只是在函数结束时释放它。
答案 1 :(得分:1)
看起来像JNI实现中的一个错误。一个明显的解决方法是使用一维数组。看起来,这个数组在Java方面没有参差不齐,因此来回转换非常简单。 1D数组中元素(i,j)
的索引为i*xdim + j
。