質問

私は、実行時に、サードパーティのJNIライブラリをロードします。
私はSDカードから直接読み込むしようとしました。それは予想通り失敗しました。
私は
その後、/データ/データ/アプリをSDカードからライブラリをコピーしようとした/してきました System.load(/data/data/app/libjni.so)
それはHTC HEROに動作しますが、Androidの2.1とHTCの伝説に失敗しました。 それは無益スタックトレースをログに記録するネイティブコードと書き込みの実行中に失敗しました 他の方法は、それを行うには? 1.5(HTCヒーロー)で動作しますが、DONOTは2.1(HTCレジェンド)で動作するコードの最高の作品、厥。

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");
役に立ちましたか?

解決

それは非実行可能とマークされていて、非実行記憶装置から実行可能なメモリページをマップすることはできませんので、

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top