5

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バイト)

10-02 14:18:58.885:W / dalvikvm(23598):1015:0x4610a008 cls = [I(24バイト)

10-02 14:18:58.885:W / dalvikvm(23598):1016:0x46109fa8 cls = [I(24バイト)

10-02 14:18:58.885:W / dalvikvm(23598):1017:0x46109fc8 cls = [I(24バイト)

10-02 14:18:58.885:W / dalvikvm(23598):1018:0x46109fe8 cls = [I(24バイト)

10-02 14:18:58.885:W / dalvikvm(23598):1019:0x4610a008 cls = [I(24バイト)

10-02 14:18:58.885:W / dalvikvm(23598):1020:0x46109fa8 cls = [I(24バイト)

10-02 14:18:58.885:W / dalvikvm(23598):1021:0x46109fc8 cls = [I(24バイト)

10-02 14:18:58.885:W / dalvikvm(23598):1022:0x46109fe8 cls = [I(24バイト)

10-02 14:18:58.885:W / dalvikvm(23598):1023:0x4610a008 cls = [I(24バイト)

10-02 14:18:58.885:W / dalvikvm(23598):JNIが配列参照テーブルの要約を固定しました(1024エントリ):

10-02 14:18:58.885:W / dalvikvm(23598):1024 of [I 24B(4 unique)

10-02 14:18:58.885:W / dalvikvm(23598):追跡された参照によって直接保持されているメモリは96バイトです

10-02 14:18:58.885:E / dalvikvm(23598):JNI固定配列参照テーブルへの追加に失敗しました(1024エントリ)

どうも

4

2 に答える 2

5

私は自分が間違っていること、もっと良いこと、やることを忘れていることを知りました。コードに別のリターンポイントがありますが、その場合に戻る前に配列を解放するのを忘れていました。関数の最後でのみ解放していました。

于 2012-10-04T12:05:57.887 に答える
1

私にはJNI実装のバグのように見えます。明らかな回避策の1つは、代わりに1次元配列を使用することです。配列はJava側でギザギザになっていないようですので、前後に変換するのは非常に簡単です。(i,j)1D配列の要素のインデックスは。になりますi*xdim + j

于 2012-10-02T21:29:19.163 に答える