2011-09-29 17 views
18

現在、CベースのNDKベースのAndroidアプリケーションを開発中です。このアプリケーションは一時ファイルを作成する必要があります。通常のLinuxシステムでは、tmpfileを使用して、これらのファイルが一時ディレクトリに正しく作成され、プロセス終了時にクリーンアップされるようにします。NDKでAndroidに一時ファイルを作成

しかし、さまざまなAndroidデバイス上の私の調査は

  • tmpfileは常に失敗したことを示すように見えます。
  • /tmpディレクトリがありません。
  • ディレクトリ/data/local/tmpは、Androidのすべての亜種には存在しません。
  • TEMP環境変数が設定されていません。
  • mkstempは、tmpfileよりうまく機能しません。今

、私は一緒に何かをハックできると確信しているが、SDKはJavaアプリケーションのためのcontext.getCacheDirFile.createTempFileを提供することを見て、私はCレベルでの等価があることを願っています。

信頼性が高く、Android搭載の方法で一時ファイルを作成する方法は誰にも分かりますか?

答えて

9

私たちが見つけた最良の方法は、起動時にContext.getCacheDirを呼び出すgetAbsolutePathとそのパスを取得し、その後、世界的にそのパスを格納するJNI関数を呼び出すことです。一時ファイルを作成する機能は、そのパスに適切な一時ファイル名を追加するだけです。

あなたが本当にJNIから別の代替を、それを取得したい場合はJNI関数にContextに渡すこととgetCacheDirへのJavaへコールバックするGetMethodID/CallObjectMethod原料の束を使用しますが、前者の方法はたくさんあります簡単です。

残念ながら、現時点ではより洗練されたソリューションはありません。

+2

'setenv()'を呼び出すには 'libcore'を使うことができます。http://stackoverflow.com/a/22315463/192373を参照してください。これは、ネイティブにキャッシュディレクトリの名前を表示するよりエレガントな方法かもしれません。 –

0

はmkstempはSTDLIB.H以下

+0

これは役に立ちますか?私はmkstempがtempディレクトリへのフルパスを含む 'template'を消費すると思います。 –

2

下NDKで利用可能でErtebolleが参照GetMethodIDメソッド/ CallObjectMethod手順です。純粋なネイティブアプリ(Visual Studio 2015でビルドされたものなど)で作業していて、Javaコードを使用できない場合は必要です。

std::string android_temp_folder(struct android_app *app) { 
    JNIEnv* env; 
    app->activity->vm->AttachCurrentThread(&env, NULL); 

    jclass activityClass = env->FindClass("android/app/NativeActivity"); 
    jmethodID getCacheDir = env->GetMethodID(activityClass, "getCacheDir", "()Ljava/io/File;"); 
    jobject cache_dir = env->CallObjectMethod(app->activity->clazz, getCacheDir); 

    jclass fileClass = env->FindClass("java/io/File"); 
    jmethodID getPath = env->GetMethodID(fileClass, "getPath", "()Ljava/lang/String;"); 
    jstring path_string = (jstring)env->CallObjectMethod(cache_dir, getPath); 

    const char *path_chars = env->GetStringUTFChars(path_string, NULL); 
    std::string temp_folder(path_chars); 

    env->ReleaseStringUTFChars(path_string, path_chars); 
    app->activity->vm->DetachCurrentThread(); 
    return temp_folder; 
} 
関連する問題