如何使用NDK在Android中创建临时文件?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (47)

我目前正在开发一个基于C的基于NDK的Android应用程序。此应用程序需要创建临时文件。在常规的Linux系统上,我会用它tmpfile来确保这些文件在临时目录中正确创建并在进程结束时清理。

不过,我对各种Android设备的调查似乎表明了这一点:

  • tmpfile 总是失败;
  • 没有/tmp目录;
  • 目录/data/local/tmp不在Android的所有变体上;
  • 没有TEMP环境变量集合;

有没有人知道一个很好的可靠和跨Android的方法来创建临时文件?

提问于
用户回答回答于

我们找到的最好方法是调用Context.getCacheDir启动,获取路径getAbsolutePath,然后调用JNI函数将该路径存储在全局中。任何想要创建临时文件的函数都会将适当的临时文件名添加到该路径中。

如果你真的想从JNI中获取它,另一种方法是将Context一个JNI函数传递给一个JNI函数,并使用一堆GetMethodID/ CallObjectMethodstuff回调Java getCacheDir,但前一种方法要简单得多。

用户回答回答于

以下是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;
}

扫码关注云+社区