CからJavaへの複雑なモデル(Objectを持つObjectとObjectListを持つObject)を返す方法が見つかりました。しかし、私には別の問題があります:メモリリーク。JavaからJNI Cへのメモリリークの回避
現在、私が取り組んでいるコードは、(C言語で)データを解析し、解析されたデータをJavaクラスに戻す必要があります。
メインJavaクラスは、より多くのJavaクラス(int型、文字列、ブール、Objに、オブジェクトのArrayListの)が含まれ、そして私は、オブジェクトのインスタンスに対して、このパターンを使用して解析されたデータを返すよ:
// Instance:LyricsLineVo
jclass findClsLyricsLine = (*env)->FindClass(env, "com/example/jni/vo/LyricsLineVo");
jmethodID initLyricsLine = (*env)->GetMethodID (env, findClsLyricsLine, initMethod,"()V");
jobject objLyricsLine = (*env)->NewObject(env, findClsLyricsLine, initLyricsLine);
jclass classLyricsLine = (*env)->GetObjectClass(env, objLyricsLine);
コードのあまりにも長く、私は他のオブジェクトを別の関数に分けて、それぞれの異なる関数に解析したデータを渡す必要があるかどうかわからないので、メモリを消費すると思います。
は私がスペースを解放する方法についていくつかの方法を読んだ:
Memory leak using JNI to retrieve String's value from Java code
Memory leak when calling java code from C using JNI
しかし、これらの適用は十分ではありません。データの解析は1回しかできませんが、その後はプログラムがクラッシュします。
このためにメモリ使用量を削減できる推奨コードはありますか?
私は以下の私のエラーログを追加している:私は
(*env)->DeleteLocalRef(env, classLyricsLine);
(*env)->DeleteLocalRef(env, objLyricsLine);
(*env)->DeleteLocalRef(env, findClsLyricsLine);
を使用してい
07-11 19:23:31.640: WARN/dalvikvm(301): ReferenceTable overflow (max=512)
07-11 19:23:31.650: WARN/dalvikvm(301): Last 10 entries in JNI local reference table:
07-11 19:23:31.650: WARN/dalvikvm(301): 502: 0x44df0930 cls=Ljava/lang/Class; 'Lcom/demo/project/vo/DurationVo;' (172 bytes)
07-11 19:23:31.650: WARN/dalvikvm(301): 503: 0x44df51a8 cls=Lcom/demo/project/vo/DurationVo; (20 bytes)
07-11 19:23:31.660: WARN/dalvikvm(301): 504: 0x44df0930 cls=Ljava/lang/Class; 'Lcom/demo/project/vo/DurationVo;' (172 bytes)
07-11 19:23:31.660: WARN/dalvikvm(301): 505: 0x4002afc8 cls=Ljava/lang/Class; 'Ljava/util/ArrayList;' (172 bytes)
07-11 19:23:31.660: WARN/dalvikvm(301): 506: 0x44df5280 cls=Ljava/util/ArrayList; (28 bytes)
07-11 19:23:31.660: WARN/dalvikvm(301): 507: 0x44df0338 cls=Ljava/lang/Class; 'Lcom/demo/project/vo/MeasureTrackPairVo;' (172 bytes)
07-11 19:23:31.660: WARN/dalvikvm(301): 508: 0x44df52a0 cls=Lcom/demo/project/vo/MeasureTrackPairVo; (28 bytes)
07-11 19:23:31.660: WARN/dalvikvm(301): 509: 0x44df0338 cls=Ljava/lang/Class; 'Lcom/demo/project/vo/MeasureTrackPairVo;' (172 bytes)
07-11 19:23:31.660: WARN/dalvikvm(301): 510: 0x4002afc8 cls=Ljava/lang/Class; 'Ljava/util/ArrayList;' (172 bytes)
07-11 19:23:31.660: WARN/dalvikvm(301): 511: 0x44df5320 cls=Ljava/util/ArrayList; (28 bytes)
07-11 19:23:31.680: WARN/dalvikvm(301): JNI local reference table summary (512 entries):
07-11 19:23:31.690: WARN/dalvikvm(301): 322 of Ljava/lang/Class; 172B (11 unique)
07-11 19:23:31.690: WARN/dalvikvm(301): 7 of Ljava/lang/Integer; 12B (7 unique)
07-11 19:23:31.690: WARN/dalvikvm(301): 10 of Ljava/lang/String; 28B (10 unique)
07-11 19:23:31.690: WARN/dalvikvm(301): 33 of Ljava/util/ArrayList; 28B (33 unique)
07-11 19:23:31.690: WARN/dalvikvm(301): 1 of Lcom/demo/project/vo/HeaderVo; 60B
07-11 19:23:31.700: WARN/dalvikvm(301): 1 of Lcom/demo/project/vo/LyricsVo; 20B
07-11 19:23:31.700: WARN/dalvikvm(301): 1 of Lcom/demo/project/vo/LyricsLineVo; 20B
07-11 19:23:31.700: WARN/dalvikvm(301): 18 of Lcom/demo/project/vo/MeasureHeaderVo; 36B (18 unique)
07-11 19:23:31.710: WARN/dalvikvm(301): 1 of Lcom/demo/project/vo/TrackHeaderVo; 60B
07-11 19:23:31.710: WARN/dalvikvm(301): 14 of Lcom/demo/project/vo/MeasureTrackPairVo; 28B (14 unique)
07-11 19:23:31.710: WARN/dalvikvm(301): 52 of Lcom/demo/project/vo/BeatVo; 60B (52 unique)
07-11 19:23:31.710: WARN/dalvikvm(301): 52 of Lcom/demo/project/vo/DurationVo; 20B (52 unique)
07-11 19:23:31.710: WARN/dalvikvm(301): Memory held directly by native code is 8540 bytes
07-11 19:23:31.720: ERROR/dalvikvm(301): Failed adding to JNI local ref table (has 512 entries)
Androidでヒープサイズを制御できますか?これに反して、ここでの解決策は* [ヒープサイズを減らす]ことです(http://stackoverflow.com/questions/1744533/jna-bytebuffer-not-getting-freed-and-causing-c-heap-to-run-out *メモリ)*。 –