2013年6月2日日曜日

Android File(C言語用にパスが欲しい, とにかくパスが欲しい)

こんにちは, Android のファイルに関する第3段です。

まず, 筆者がはまった問題というのはこんなのです。

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 件のコメント:

コメントを投稿