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 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