【教えてください】「The code for the static initializer is exceeding the 65535 bytes limit」について

788 views
Skip to first unread message

micco

unread,
Dec 11, 2010, 10:14:26 AM12/11/10
to 日本Androidの会
こんばんは。
miccoです。

また困っております・・・。

フィールド表示用にマップチップ番号を格納した配列をクラス変数で定義したのですが、
eclipseで以下のエラーが出てしまします。
======================================================
The code for the static initializer is exceeding the 65535 bytes limit
======================================================

この配列は、
static final int MAP[] = {
1,1,1,1,1,・・・・・・・・・,
1,2,2,2,2,・・・・・・・・・,
・・・・・・・・・・・・・・・・・,
・・・・・・・・・・・・・・・・・,
・・・・・・・・・・・・・・・・・,
};
のような形で40,000の要素を持っています。
また、スタティックではない定数で保持した場合も65KBが限界というようなエラー
になりました。

65KBが限界とすると、RPGのような大きなフィールドを持つアプリを作る場合、
どのような方法でフィールドデータを保持するのでしょうか?

それとも他の原因が考えられるのでしょうか?

解決方法が分からず困っておりますので、どなたかご教示頂ければ幸いです。
何でも結構ですので、お気づきの点がありましたら、よろしくお願いいたします。

田代透

unread,
Dec 11, 2010, 1:06:54 PM12/11/10
to android-g...@googlegroups.com
田代と申します

 マップデーターを分割して複数の配列に分けて、getMap(x,y)とかいった関数を用意して分割されているマップのデーターを取り出すようにするとかすると、マップデータを必要とするプログラム側では分割されてることを意識せずにすむようなプログラムの書き方が出来ます。多少効率は落ちますが。

 あと、int で確保していますが、byte で確保すれば64Kの壁を越えずにすむのではないでしょうか?

2010年12月12日0:14 micco <gou...@gmail.com>:

> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。
>
>

--
--
Toru Tashiro
toru...@gmail.com

micco

unread,
Dec 12, 2010, 1:39:31 AM12/12/10
to 日本Androidの会
田代さん

こんにちは。
miccoです。

コメントありがとうございます!
最終的にはやむ得ないと思っていましたが、やはりマップデータを分割して扱うという方法ですね。
また、確かにintではなく、byteを使う方法も有効かもしれません。
整数型ってあまり意識していなかったので、全く気付いてませんでした。
ビット長が4分の1になりますからね。
さっそく試してみます。

On 12月12日, 午前3:06, 田代透 <toru2...@gmail.com> wrote:
> 田代と申します
>
>  マップデーターを分割して複数の配列に分けて、getMap(x,y)とかいった関数を用意して分割されているマップのデーターを取り出すようにするとかすると-、マップデータを必要とするプログラム側では分割されてることを意識せずにすむようなプログラムの書き方が出来ます。多少効率は落ちますが。

> toru2...@gmail.com- 引用テキストを表示しない -
>
> - 引用テキストを表示 -

micco

unread,
Dec 12, 2010, 10:42:13 PM12/12/10
to 日本Androidの会
こんにちは。
miccoです。

試してみた結果です。

①配列要素をbyte型に変更しましたが、エラーの解消には至りませんでした。
実際に格納されている初期データのサイズに依存しているのかしれません。

②そこで、同一クラス内でマップデータ配列を分割しましたが、エラーの解消
には至りませんでした。

③さらに、複数のクラスに②の各配列を分けて保持させたところ、問題が解
消しました。クラス毎にスタティック変数の初期データ量に上限があるのかも
しれません。

ありがとうございました。

On 12月12日, 午後3:39, micco <gou...@gmail.com> wrote:
> 田代さん
>
> こんにちは。
> miccoです。
>
> コメントありがとうございます!
> 最終的にはやむ得ないと思っていましたが、やはりマップデータを分割して扱うという方法ですね。
> また、確かにintではなく、byteを使う方法も有効かもしれません。
> 整数型ってあまり意識していなかったので、全く気付いてませんでした。
> ビット長が4分の1になりますからね。
> さっそく試してみます。
>
> On 12月12日, 午前3:06, 田代透 <toru2...@gmail.com> wrote:
>
>
>
> > 田代と申します
>

> >  マップデーターを分割して複数の配列に分けて、getMap(x,y)とかいった関数を用意して分割されているマップのデーターを取り出すようにするとかすると--、マップデータを必要とするプログラム側では分割されてることを意識せずにすむようなプログラムの書き方が出来ます。多少効率は落ちますが。

> > - 引用テキストを表示 -- 引用テキストを表示しない -
>
> - 引用テキストを表示 -

むらせ

unread,
Dec 13, 2010, 5:34:22 AM12/13/10
to android-g...@googlegroups.com
こんにちは。
むらせです。

解決されているようですがちょいと情報だけでも。

http://java.sun.com/docs/books/jvms/second_edition/html/ClassFile.doc.html#88659
http://www.swingingblue.net/mt/

javaの制限としてclassファイルには64kb制限があり、ClassFile structureの問題なのでdalvik もこのあたり引き継いでいるようです。

田代透

unread,
Dec 13, 2010, 6:21:02 AM12/13/10
to android-g...@googlegroups.com
miccoさん、むらせさん

 64Kの壁がclassごとにあるというのは知りませんでした。ありがとうございました。

 いまさらですが、配列をbyteにすると同時に初期化数値のほうも
{ (byte)1, (byte)2…}
とかするともしかしたら初期化データーがコンパクトになるかも(javaだとどうなのだろう)。また、マップデーターを別ファイル等のして読み込ませてみるとか。

2010年12月13日12:42 micco <gou...@gmail.com>:

micco

unread,
Dec 13, 2010, 10:48:44 PM12/13/10
to 日本Androidの会
むらせさん、田代さん

こんにちは。
miccoです。

コメントありがとうございます。
確かに別ファイルで保持して読み込ませる手もありそうですね。
やったことがないので、実現方法を勉強する必要がありますが、参考になりました。
ありがとうございました。


On 12月13日, 午後8:21, 田代透 <toru2...@gmail.com> wrote:
> miccoさん、むらせさん
>
>  64Kの壁がclassごとにあるというのは知りませんでした。ありがとうございました。
>
>  いまさらですが、配列をbyteにすると同時に初期化数値のほうも
> { (byte)1, (byte)2…}

> とかするともしかしたら初期化データーがコンパクトになるかも(javaだとどうなのだろう)。また、マップデーターを別ファイル等のして読み込ませてみるとか-。


>
> 2010年12月13日12:42 micco <gou...@gmail.com>:
>
>
>
>
>
> > こんにちは。
> > miccoです。
>
> > 試してみた結果です。
>
> > ①配列要素をbyte型に変更しましたが、エラーの解消には至りませんでした。
> > 実際に格納されている初期データのサイズに依存しているのかしれません。
>
> > ②そこで、同一クラス内でマップデータ配列を分割しましたが、エラーの解消
> > には至りませんでした。
>
> > ③さらに、複数のクラスに②の各配列を分けて保持させたところ、問題が解
> > 消しました。クラス毎にスタティック変数の初期データ量に上限があるのかも
> > しれません。
>
> > ありがとうございました。
>
> > On 12月12日, 午後3:39, micco <gou...@gmail.com> wrote:
> >> 田代さん
>
> >> こんにちは。
> >> miccoです。
>
> >> コメントありがとうございます!
> >> 最終的にはやむ得ないと思っていましたが、やはりマップデータを分割して扱うという方法ですね。
> >> また、確かにintではなく、byteを使う方法も有効かもしれません。
> >> 整数型ってあまり意識していなかったので、全く気付いてませんでした。
> >> ビット長が4分の1になりますからね。
> >> さっそく試してみます。
>
> >> On 12月12日, 午前3:06, 田代透 <toru2...@gmail.com> wrote:
>
> >> > 田代と申します
>

> >> > マップデーターを分割して複数の配列に分けて、getMap(x,y)とかいった関数を用意して分割されているマップのデーターを取り出すようにするとかすると---、マップデータを必要とするプログラム側では分割されてることを意識せずにすむようなプログラムの書き方が出来ます。多少効率は落ちますが。

Reply all
Reply to author
Forward
0 new messages