2013.08.21
【Android NDK】local reference table overflowのエラー
なんかそんなのがでました。
いろんな処理を組み込んでいたら以下のようなエラーが出た。
JNI ERROR (app bug): local reference table overflow (max=512)
状況的には以下のページで起きているのと同じようです。
Link:JNIでReferenceTable overflowが発生したのでDeleteLocalRefを使う | TechRacho
NewByteArrayのようなjava領域のメモリ確保は512個しかできないよということらしい。
それをちゃんと開放していないからこのエラーが出ているらしい。
あっさりいうとDeleteLocalRefしていないものがあるということ。
開放されているかちゃんとチェックするにはとりあえずループで回して
指定回数回っていれば問題ないという事になります。
一つでも開放を忘れているとどんどんつまれていき512個に到達し
上記のエラーが出るわけです。
サンプルとしてはこんな感じでしょうか?
int i; for( i = 0; i < 512; i++ ) { //対象関数 }
今回問題になったのは以下の部分でした。
jaryRet = (jbyteArray)env->CallStaticObjectMethod( jcls, mj, 2, nType, jaryStr );
CからJavaを呼び出しByteArrayを返却してもらっているのですが
戻り値のjaryRetについてもC側が開放する必要があるみたいです。
DeleteLocalRefをするものはNewByteArray以外にも
あるという事は理解しておかないといけません。
関連記事