ubicacion temporales studio ndk how borrar archivos android-ndk temporary-files

android-ndk - temporales - ndk bundle android studio



Crear archivos temporales en Android con NDK (4)

Actualmente estoy trabajando en una aplicación de Android basada en C, basada en NDK. Esta aplicación necesita crear archivos temporales. En un sistema Linux normal, utilizaría tmpfile para asegurarme de que estos archivos se crean correctamente en un directorio temporal y se limpian al final del proceso.

Sin embargo, mis investigaciones en varios dispositivos Android parecen indicar que

  • tmpfile siempre falla;
  • no hay directorio /tmp ;
  • directorio /data/local/tmp no está presente en todas las variantes de Android;
  • no hay una variable de entorno TEMP establecida;
  • mkstemp no funciona mejor que tmpfile .

Ahora, estoy seguro de que podría hackear algo juntos, pero dado que el SDK ofrece las aplicaciones context.getCacheDir y File.createTempFile para Java, espero que haya un equivalente en C-level.

¿Alguien sabe de un buen método confiable y cruzado de Android para crear un archivo temporal?


A continuación se muestra el procedimiento GetMethodID / CallObjectMethod al que hace referencia Ertebolle. Es necesario si está trabajando con una aplicación nativa pura (como la desarrollada por Visual Studio 2015) y no puede usar el código de 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; }


La mejor forma que hemos encontrado es llamar a Context.getCacheDir al inicio, obtener su ruta con getAbsolutePath y luego llamar a una función JNI para almacenar esa ruta en un getAbsolutePath global. Cualquier función que quiera crear un archivo temporal simplemente agrega un nombre de archivo temporal adecuado a esa ruta.

Si realmente quieres buscarlo desde JNI, otra alternativa sería pasar un Context a una función JNI y usar un montón de cosas GetMethodID / CallObjectMethod para volver a llamar a Java para obtener getCacheDir , pero el primer enfoque es mucho más simple.

Desafortunadamente, no parece haber una solución más elegante en este momento.



mkstemp está disponible en el NDK bajo stdlib.h