* ICONIA TAB A500でNDK使用アプリが実行できない不具合 [#oe012180]

[[[<< 戻る]>FrontPage]]

このページは、ICONIA TAB A500で「NDKを利用して作られたアプリ」が一部実行できない不具合について調べた結果をまとめたものです。

この文書が書かれている時点では、ICONIA TAB A500のOSバージョンは「3.2.1, 2.6.36.3+, Acer_A500_7.009.03_AAP_CUS6JP」です。

#contents




** 配布ファイル [#y95304ec]

- 第2版
-- &ref(landloader_java_2012_0120_2.zip);
-- &ref(landloader_native_2012_0120_2.zip);
-- mkd.sh/mkr.shに不要な作業が残っていたのを削除。

- 第1版
-- &ref(landloader_java_2012_0120_1.zip);
-- &ref(landloader_native_2012_0120_1.zip);
-- 最初のリリース。



** 現象 [#w839a9d2]

上記の配布ファイルにおいて、特に不具合なく実行できるはずのアプリ「java_t01_ng.apk」「native_t01_ng.apk」が、ICONIA TAB A500では実行できません。

同梱されている「java_t02_ok.apk」「native_t02_oj.apk」は、この不具合に対する策を施しており、問題なく実行することができます。

実行できない場合、LogCatには以下のような「NDKで使われる関数に対するjava.lang.UnsatisfiedLinkError」によるログが残ります。

 01-19 20:50:51.090: E/AndroidRuntime(15776): java.lang.UnsatisfiedLinkError:
  Cannot load library: reloc_library[1315]:    83 cannot locate 'AConfiguration_new'...




** 原因 [#d5644c9e]

ICONIA TAB A500をADB接続し、以下のように入力します。

 > adb shell
 
 $ echo $LD_LIBRARY_PATH
 /vendor/lib:/system/lib
 
 $ ls -l /vendor/lib/libandroid.so
 ls -l /vendor/lib/libandroid.so
 -rw-r--r-- root     root      3670478 2011-10-06 08:25 libandroid.so
 
 $ ls -l /system/lib/libandroid.so
 ls -l /system/lib/libandroid.so
 -rw-r--r-- root     root        62021 2011-12-30 23:26 libandroid.so

ICONIA TAB A500には、2つのフォルダに異なる libandroid.so が格納されています。

/vendor/lib/libandroid.so は、ICONIA TAB A500のベンダであるAcerが独自に作成したものが納められたライブラリと思われます。

/system/lib/libandroid.so は、Androidシステムで共通に使われているライブラリで、「NDKライブラリ作成時に"-landroid"オプションによりリンクされる」ものです。

ICONIA TAB A500で「NDKを利用して作られたアプリ」が一部実行できない原因は、「/system/lib/libandroid.so をリンクしなければならないアプリ」が、同名で先に見つかる /vendor/lib/libandroid.so をリンクしようとして失敗するためです。




** 対策 [#e820cacb]

アプリ側で、明示的にフルパス指定して「/system/lib/libandroid.so をロードする」ことで、この問題を回避することができます。この方法はすべてのAndroid機で有効なため、ICONIA TAB A500以外で実行したときにも副作用はありません。

「/system/lib/libandroid.so をロードする」方法については、以下のようになります。

- JavaからNDKライブラリを呼び出す場合は、System.load()で /system/lib/libandroid.so を読み込む。

- Native Activityの場合は、「dlopen()で/system/lib/libandroid.soを読み込んでから実体ライブラリを読み込む」処理をするローダーライブラリを先に実行する。

詳細な実装方法については、配布ファイルに含まれているソースファイルをご覧ください。




** ライセンスなど [#e163cbb8]

配布ファイルのライセンスについては、同梱のAPACHE-LICENSE-2.0.txtをご覧ください。

また、これらの不具合について、当方から発売元であるAcerに対して何らかの行動を起こす予定はありません。当方に代わり行動を起こされる場合や、この不具合の修正が行われたことを認識された場合、その他何らかの情報がある場合は、当方までお知らせいただければ幸いです。


** その後 [#df2b14f5]

「3.2.1, 2.6.36.3+, Acer_A500_7.015.05_AAP_CUS6JP」にて、修正が確認されました。

 $ ls -l /vendor/lib/
 ls -l /vendor/lib/
 -rw-r--r-- root     root      3667482 2011-12-14 09:44 libandroid_m2u.so


** コメント [#m72eb9fe]

#comment


[[[<< 戻る]>FrontPage]]

RIGHT:counter: today=&counter(today);, yesterday=&counter(yesterday);, total=&counter;

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS