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
-
tmpfilesiempre falla; - no hay directorio
/tmp; - directorio
/data/local/tmpno está presente en todas las variantes de Android; - no hay una variable de entorno
TEMPestablecida; -
mkstempno funciona mejor quetmpfile.
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.
Por lo que sé, no hay global / tmp en Android, debes usar el directorio de caché. Utilice getCacheDir () para obtener el dir "tmp".
http://developer.android.com/guide/topics/data/data-storage.html#filesInternal y http://developer.android.com/reference/android/content/Context.html#getCacheDir%28%29
mkstemp está disponible en el NDK bajo stdlib.h