android - 添加到 JNI 固定数组引用表失败(1024 个条目)

标签 android c android-ndk java-native-interface overflow

我从 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 overflow (max=1024)

10-02 14:18:58.885: W/dalvikvm(23598): Last 10 entries in JNI pinned array reference table:

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 pinned array reference table summary (1024 entries):

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

10-02 14:18:58.885: W/dalvikvm(23598): Memory held directly by tracked refs is 96 bytes

10-02 14:18:58.885: E/dalvikvm(23598): Failed adding to JNI pinned array ref table (1024 entries)

谢谢

最佳答案

我发现我做错了什么,更好的是,我忘了做什么。我在代码中有另一个返回点,但在那种情况下我忘记在返回之前释放数组,我只是在函数结束时释放它。

关于android - 添加到 JNI 固定数组引用表失败(1024 个条目),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12695610/

相关文章:

c - 在输入值的同时对数组进行排序

c - 带有指向字符的指针的情况

android - 带有非免费软件包(SURF)的OpenCV Android

java - 在android中使用异常

android - 由 : java. lang.IllegalStateException 引起:尚未为此提供程序指定值

java - 值引擎不是对象 android.speech.tts.TextToSpeech 的成员

android - 为什么 Android jvm->GetEnv() 会为多个线程返回相同的 "env"。?

java - 这是一种策略模式还是回调?

c - 单核和双核多线程

android - AOSP : how to get uid of given package name in c?