まず, 筆者がはまった問題というのはこんなのです。
Android のソフトウェアを開発していて, C, C++で書かれたライブラリを使いたい。
NDK で, JNI と接続して, Java から, ファイルのパスを渡して, C の fopenとかで開きたい
しかし, アプリケーションの res/raw や, assets に入れたら, パスが取れない。
というものです。
そこで, 前とその前のエントリーを応用して解決します
・ Android File(アプリケーションに同梱)
・ Android File(保存したい)
アプリケーションに同梱して, プログラム内で, アプリケーション領域にコピーする
アプリケーション領域に入れば, ファイル File が取得できるので, getAbsolutePath() でもなんでも,
パスが取れ, JNI に String として渡せます
※これだとファイルが2重になってしまいますが, Download という選択を取らない限り, 難しいかなと思っています。
ではサンプルです。Activity ごと書いてみました。
ファイルのコピーは Apache Commons IO が便利です。 commons-io-X.x.jar を使います
Android でも使えます。
public class AssertFilePrepareActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); File data = getFilesDir(); // Application File file = new File( data, "test.txt"); try { if ( !file.exists() ) { // Copy file from assets AssetManager as = getResources().getAssets(); IOUtils.copy(as.open("test2.txt"), new FileOutputStream(file)); } } catch ( IOException oops ) { oops.printStackTrace(); } } }
assets から, 内容そのものをコピーしました。 InputStream が取れるので, FileOutputstream で返してあげるだけです。
この処理は最初の1回で十分なので, exists で存在確認をしています。
0 件のコメント:
コメントを投稿