2011-01-19 10 views
14

¿Hay alguna otra manera de escribir un archivo en otro lugar que no sea en la tarjeta SD?Android NDK Escribir archivo

He intentado muchas camino diferente en el sistema de archivos, pero FOPEN siempre devuelven NULL, a excepción de cualquier archivo que he escritura/lectura en el interior del/sdcard/...

¿Hay alguna otra cosa equivalente a:

¿Eso le permite escribir como en el sistema de archivos o algo así?

+0

Respondido en este enlace: vgokul129

Respuesta

5

Tiene acceso a dos ubicaciones desde su aplicación, la tarjeta SD y un directorio de datos especial para su aplicación. Cualquier otro lugar está fuera de los límites a menos que tenga acceso de root.

+0

Dónde está la ubicación de ese "directorio de datos especial" ? Porque supongo que no todos los teléfonos tienen una tarjeta SD ... Entonces la/sdcard/dir. no es confiable TIA – bobmc

+1

Puede preguntar al sistema operativo dónde se encuentra el directorio en Java utilizando los siguientes comandos: mContext.getFilesDir(); mContext.getExternalFilesDir (null); Debe favorecer el almacenamiento externo para objetos grandes, ya que el dispositivo puede tener un almacenamiento interno limitado. – CaseyB

+0

Tengo acceso de root al dispositivo. ¿Podría explicar cómo puedo acceder al sistema de archivos? Intentar abrir un archivo en el sistema no funciona para mí. Verifique este [enlace] (http://stackoverflow.com/questions/39785497/accessing-root-files-system-dev-from-a-native-library-in-android-applicatio) – Arjun

17
  1. Siempre puede acceder al directorio en el que se coloca su aplicación.

    Este directorio es por lo general:

    data/data/<Your_package_name_usually com.android.appName>/files/<your_filename>

    pero mejor uso getFilesDir() a garantizar ruta de archivo válida con los futuros cambios de versión de androide.

  2. Si quieres usar almacenamiento externo lugar, asegúrese de colocar esta línea de código en su aplicación manifiesta a permiso ganancia.

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
    

    A continuación, utilice el directorio sdcard:

    getExternalStorageDirectory(); //usually : /sdcard/<your_filename>

  3. De lo contrario, puede arrancar de raíz el dispositivo y tener acceso a todo el sistema de archivos . Pero tendrá que solicitar a todos los usuarios de su aplicación obtener acceso raíz en su dispositivo antes de usando su aplicación. Algunos juegos usan esta forma de hacer las cosas, pero yo no lo recomendaría. Si todavía está quiere hacer esto, busque Superuser aplicación para Android, es gratis y confiable.

Una vez que tenga el directorio androide, basta con crear un método nativo JNI que reciben un parámetro jstring, y configurarlo dentro de su código nativo. Conviértalo en std :: string, y estará listo para usarlo con fopen().

//Inside your java activity 
File f = this.getApplicationContext().getFilesDir(); 
LibLoader.setupArchiveDir(f.toString()); 

//Inside your JNI wrapper 
JNIEXPORT bool JNICALL Java_com_android_appName_LibLoader_setupArchiveDir(JNIEnv * env, jobject obj, jstring dir) 
{ 
     const char* temp = env->GetStringUTFChars(dir, NULL); 
    std::string stringDir(temp); 

     // Will be receive as a std::string inside C++ code 
    MyNativeObjectInC++->SetupArchiveDir(stringDir); 
} 

Editar:

Es posible que tenga manualy crea los/archivos en C antes de poder usarlo en el primer tiempo:

int result_code = mkdir("/data/data/com.app/files/", 0770)

Saludos !

+0

que contiene las banderas '0770' en la última muestra de código. 'mkdir ("/data/data/com.app/databases ", S_IRWXU | S_IRWXG | S_IWOTH | S_IXOTH);' no funciona para mí :( – amin

-1

Uno debe crear el archivo antes de usar la función fopen(filePath, "a+"). O use fopen(filePath, "a")