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

24

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

然而,我对各种Android设备的调查似乎表明:

  • tmpfile总是失败;
  • 没有/tmp目录;
  • 不是所有Android变体都有/data/local/tmp目录;
  • 没有设置TEMP环境变量;
  • mkstemp并不比tmpfile更好。

现在,我相信我可以想办法解决问题,但是既然SDK提供了context.getCacheDirFile.createTempFile用于Java应用程序,我希望在C级别也有类似的方法。

是否有人知道一个可靠而跨Android的创建临时文件的方法?

5个回答

14
我们发现的最好方式是在启动时调用 Context.getCacheDir,使用getAbsolutePath获取其路径,然后调用一个JNI函数将该路径存储在全局变量中。任何想创建临时文件的函数只需要将适当的临时文件名附加到该路径即可。
如果您真的想从JNI中获取它,则另一种选择是将Context传递给JNI函数,并使用一堆GetMethodID / CallObjectMethod来回调Java来调用getCacheDir,但前者方法更简单。
不幸的是,目前似乎没有更优雅的解决方案。

2
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Alex Cohn

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

0
  1. 在应用程序启动时,使用ContentProvider获取缓存目录的路径。
  2. 实现具有与POSIX的tmpfile相同签名的tmpfile函数。
  3. 在您的tmpfile函数中使用先前获取的缓存目录调用mkstemp

将其打包为.aar文件,以便可以通过gradle进行使用。

https://github.com/ViliusSutkus89/tmpfile-Android


0

在stdlib.h下,NDK中提供了mkstemp函数。


这有帮助吗?我认为mkstemp会使用包含临时目录完整路径的“模板”。 - Simon Warta

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接