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以外にも
あるという事は理解しておかないといけません。

Pocket

ニャッキ格闘列伝 > プログラム >

前の記事:
次の記事:

コメントリスト

コメントなし

コメント



*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

こんなタグが使えるみたいよ:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>