【问题标题】:ReferenceTable overflow (jni android), array objects releaseReferenceTable溢出(jni android),数组对象释放
【发布时间】:2013-12-25 21:13:11
【问题描述】:

我正在为 android 制作游戏,其中我使用了一些 JNI。过了一会儿我得到这个错误:

12-25 22:01:23.304:W/dalvikvm(13096):参考表溢出

(max=1024) 12-25 22:01:23.304: W/dalvikvm(13096): 最后 10 个条目

JNI 固定数组引用表:12-25 22:01:23.304:

W/dalvikvm(13096): 1014: 0x4052ffd8 cls=[I (28 bytes) 12-25

22:01:23.304: W/dalvikvm(13096): 1015: 0x4052fff8 cls=[I (28 bytes)

12-25 22:01:23.304: W/dalvikvm(13096): 1016: 0x40530018 cls=[I (28

字节)12-25 22:01:23.304: W/dalvikvm(13096): 1017: 0x40530038 cls=[I

(28 字节) 12-25 22:01:23.304: W/dalvikvm(13096): 1018: 0x40530058 cls=[I (28 bytes) 12-25 22:01:23.304: W/dalvikvm(13096): 1019:

0x40530078 cls=[I (28 bytes) 12-25 22:01:23.304: W/dalvikvm(13096):

1020: 0x40530098 cls=[I (28 字节) 12-25 22:01:23.304:

W/dalvikvm(13096): 1021: 0x405300b8 cls=[I (28 bytes) 12-25

22:01:23.304: W/dalvikvm(13096): 1022: 0x405300d8 cls=[I (28 bytes)

12-25 22:01:23.304: W/dalvikvm(13096): 1023: 0x405300f8 cls=[I (28

bytes) 12-25 22:01:23.304: W/dalvikvm(13096): JNI pinned array

参考表汇总(1024条):12-25 22:01:23.314:

W/dalvikvm(13096): 539 of [I 28B (113 unique) 12-25 22:01:23.314:

W/dalvikvm(13096): 140 of [I 36B (28 unique) 12-25 22:01:23.314:

W/dalvikvm(13096): 20 of [I 44B (4 unique) 12-25 22:01:23.314:

W/dalvikvm(13096): 325 of [I 52B (65 unique) 12-25 22:01:23.314:

W/dalvikvm(13096):被跟踪的 refs 直接持有的内存是 7728 字节

我读到我必须释放内存(即 ReleaseIntArrayElements),但在这种情况下我不知道该怎么做。我在java中有二维数组,我将它们传递给本机函数并在本地转换为向量>。

jstring convert(JNIEnv *env, string ruch) {
  jstring result;
  char *writable = new char[ruch.size()+1];
  copy(ruch.begin(), ruch.end(), writable);
  writable[ruch.size()] = '\0';
  result = env->NewStringUTF(writable);
  delete[] writable;
  return result;
}

JNIEXPORT jstring JNICALL Java_pl_game_yapapersoccer_Ndk_move
  (JNIEnv *env, jclass obj, jint player, jint index, jint mode, jobjectArray matrix, jobjectArray matrixNeighbours, jobjectArray matrixWagi) {
    int matrix_size = env->GetArrayLength(matrix);
    vector<vector<int> > vMatrix(matrix_size);
    for (int i=0;i<matrix_size;i++) {
      vector<int> row(matrix_size);
      vMatrix[i] = row;

      jintArray oneDim= (jintArray)env->GetObjectArrayElement(matrix, i);
      env->GetIntArrayRegion( oneDim, 0, matrix_size, &vMatrix[i][0] );
    }

    vector<vector<int> > vMatrixNeighbours(matrix_size);
    for (int i=0;i<matrix_size;i++) {
      jintArray oneDim= (jintArray)env->GetObjectArrayElement(matrixNeighbours, i);
      jint *element=env->GetIntArrayElements(oneDim, 0);
      int rowSize = env->GetArrayLength(oneDim);
      vector<int> row(rowSize);
      vMatrixNeighbours[i] = row;
      env->GetIntArrayRegion( oneDim, 0, rowSize, &vMatrixNeighbours[i][0] );
    }

    vector<vector<int> > vMatrixWagi(matrix_size);
    for (int i=0;i<matrix_size;i++) {
      jintArray oneDim= (jintArray)env->GetObjectArrayElement(matrixWagi, i);
      jint *element=env->GetIntArrayElements(oneDim, 0);
      vector<int> row(2);
      vMatrixWagi[i] = row;
      env->GetIntArrayRegion( oneDim, 0, 2, &vMatrixWagi[i][0] );
    }

    // something something, ruch is c++ string, all legit
    return convert(env,ruch);

  }

这适用于最初的几次通话。一个释放对象的例子将不胜感激。除非完全有必要,否则我想在 java 中保留 2d 数组,在 c++ 中保留向量的向量。

【问题讨论】:

    标签: java android c++ java-native-interface


    【解决方案1】:

    据我所知,如果你调用GetIntArrayElements 方法,你应该调用ReleaseIntArrayElements 来释放引用。您可以查看jni.h 文件以搜索名为 Release** 的方法。希望对您有所帮助。

    【讨论】:

    • 我承认,我失败了。我之前使用 *element 进行了迭代,但是当我更改为 intarrayregion 时,我忘记删除不再需要的 jint *element = ... 行。
    猜你喜欢
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    • 2017-12-02
    相关资源
    最近更新 更多