私は Ruby で書かれた 2 つの異なるプロジェクトを持っています。Ruboto を使用して Ruby を .apk にパックし、Android デバイスにプッシュできるようにしています。どちらのプロジェクトも私の電話と電話エミュレーターでコンパイルおよび実行されますが、両方のプロジェクトに「require 'json'」という行を追加し、他に何も変更しないと、起動時に失敗し、電話のホームページに戻ります。だから、それは間違いなくその線で何かです. これを引き起こす原因についてのアイデアはありますか?
2 に答える
Ruboto は、スタック サイズを増やしてコードを実行するためのヘルパー メソッドを提供します。
require 'ruboto/util/stack'
with_large_stack{require 'json'}
また
with_large_stack do
require 'json'
end
これにより、コードが別のスレッドで実行され、スタックが大きくなり、深い再帰が可能になります。with_large_stack メソッドのデフォルトのスタック サイズは 64KB です。この値は、オプションの整数引数またはオプション ハッシュを使用して設定できます。
with_large_stack(128){require 'json'}
また
with_large_stack(:size => 128){require 'json'}
スタック サイズはキロバイト (KB) で指定されます。
私は同じ問題を抱えていました。あなたが使用することができます
adb logcat
クラッシュに関する詳細情報を取得します。そこを見ると、スタック オーバーフローに関するエラー メッセージが表示されます。json/pure のみを要求することで、このスタック オーバーフローを回避できます。
require 'json/pure'
これはまだ一般的な問題の解決にはなりません: ほとんどの require 呼び出しはスタック オーバーフローにつながります。Google 経由で、スタック オーバーフローでクラッシュするまで、Android はネストされた再帰呼び出しをあまり多く持つことができず、約 22 個しかないことがわかりました。私が指摘された解決策は、再帰の代わりに反復を使用することでした。:)
だから今、私は本当の解決策を知りません。yaml、httpi、nokogiri など、大規模または有用な gem のほとんどで同じ問題が発生します。
編集: Google メーリング リストにも同様の質問があります。