2

実行時にサードパーティの jni ライブラリをロードしたい。
SDカードから直接ロードしようとしました。予想通り失敗しました。
ライブラリを sdcard から /data/data/app/ にコピーしようとしまし
System.load(/data/data/app/libjni.so)
たが、HTC HERO では動作しますが、Android 2.1 の HTC Legend では失敗します。ネイティブ コードの実行中に失敗し、情報のないスタック トレースをログに記録します。それを行う他の方法はありますか? これは、1.5 (HTC Hero) では機能しますが、2.1 (HTC Legend) では機能しない最高のコードです。

FileInputStream fis = new FileInputStream("/sdcard/libjni.so");
File nf = new File("/data/data/app/libjni.so");
FileOutputStream fos = new FileOutputStream(nf);
byte[] buf = new byte[2048];
int n;
while ((n = fis.read(buf)) > 0)
    fos.write(buf, 0, n);
fis.close();
fos.close();
System.load("/data/data/app/libjni.so");
4

1 に答える 1

4

Android のダイナミック ローダーは、SD カードのファイル システムから実行可能コードを読み込むことができません。これは、非実行可能とマークされており、実行可能メモリ ページを非実行可能ストレージからマップできないためです。(理論的には、コンテンツを実行可能な匿名のマップされたページに手動でコピーできますが、それは醜いです.SD上のアプリをサポートするAndroidのバージョンは、SDカード上のファイルに含まれる実行可能なファイルシステムをマウントしますが、サードパーティのアプリはそれらを書き込むことができません)

しかし、できることは、ライブラリを内部ストレージの書き込み可能な場所に書き込むことです。書き込みアクセス権がない lib ディレクトリではなく、 Context.getDir() または Context.getFilesDir() から見つかった別の場所に書き込んでからロードします。 System.loadLibrary() の代わりに System.load() を使用してフル パスと .so ファイル名を使用します。

于 2011-07-29T16:38:43.027 に答える