2013-03-07 17 views
9

Sto provando a scrivere su un file di output utilizzando NDK e non sembra funzionare. Il codice che ho scritto è simile al seguente:Android: File IO dalla scheda SD utilizzando l'NDK

JNIEXPORT jdouble JNICALL Java_com_example_sdcardtest2_CppMethods_nativeCalculations (JNIEnv* env, jclass clazz, jdouble dub){ 
    jdouble hub = dub + 10; 
    FILE* file = fopen("/sdcard/textTest.txt","w+"); 
    fputs("HELLO WORLD!\n", file); 
    fclose(file); 
return hub; 
} 

Il motivo per cui il tipo di ritorno è un doppio, è che sto pensando di usare la funzione per un altro scopo, ma sto provando io file di prima. Nel logcat, sto ottenendo il seguente errore:

Fatal signal 11: (SIGSEGV) at 0x00000000c (code = 1) ..... 

La cosa divertente è, quando provo a scrivere o leggere dallo stesso file nell'attività chiamante utilizzando io di file java, io non sto avendo problemi. E mi sono assicurato di avere i permessi di scrittura nel file manifest. Inoltre, se rimuovo la riga FILE* file ... e provo a utilizzare il doppio valore restituito dalla funzione, il programma funziona correttamente. Qualcuno può aiutarmi per favore? Il problema potrebbe essere qualcosa che dovrei includere nei file Android.mk o Application.mk, ad esempio?

UPDATE sto usando un Samsung Galaxy Note 2, se questo fa alcuna differenza

UPDATE2

Ecco il codice completo: attività

java:

public class MainActivity extends Activity { 
private TextView text1; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    this.text1 = (TextView) findViewById(R.id.textView1); 
    double d = CppMethods.nativeCalculations(2.80); 
    String s = "The value of d is = " + d; 

    File f1 = new File("/sdcard/textTest.txt"); 
    InputStream is = null; 
    try { 
     is = new FileInputStream(f1); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 

    Scanner reader = new Scanner(is); 


    this.text1.setText(reader.nextLine().subSequence(0, s.length())); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.activity_main, menu); 
    return true; 
} 

} 

Ecco il metodo nativo:

/* DO NOT EDIT THIS FILE - it is machine generated */ 
#include "com_example_sdcardtest2_CppMethods.h" 
#include <stdio.h> 
#include <string.h> 


/* 
* Class:  com_example_sdcardtest2_CppMethods 
* Method: nativeCalculations 
* Signature: (D)D 
*/ 

JNIEXPORT jdouble JNICALL Java_com_example_sdcardtest2_CppMethods_nativeCalculations 
    (JNIEnv* env, jclass clazz, jdouble dub){ 
    jdouble hub = dub + 10; 
    FILE* file = fopen("/sdcard/textTest.txt","w+"); 
    fputs("hello, world\n", file); 
    fclose(file); 




    return hub; 
} 

Ecco Android.mk:

LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS) 
LOCAL_SRC_FILES := com_example_sdcardtest2_CppMethods.c 
LOCAL_MODULE := com_example_sdcardtest2_CppMethods 
include $(BUILD_SHARED_LIBRARY) 

Ed ecco il manifesto:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.sdcardtest2" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="8" 
     android:targetSdkVersion="17" /> 

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

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name="com.example.sdcardtest2.MainActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 

UPDATE

Ultimo aggiornamento: ho provato lo stesso codice su qualcun altro telefono , anche una nota galassia 2, e ha funzionato. Sembra che il problema sia stato con il mio telefono. sigh

+0

il file è null allora ... – auselen

+0

Il file è effettivamente nullo, ma come ha senso? Se il file non si trova nella directory, fopen lo creerà e quindi scriverà su di esso. Inoltre, come ho detto nella domanda, l'utilizzo dello stesso percorso esatto nel file di attività Main.java non mi dà alcun errore (utilizzando 'File f1 = nuovo File ("/sdcard/textTest.txt ")' – user1023420

+0

avere l'autorizzazione 'android.permission.WRITE_EXTERNAL_STORAGE'? – auselen

risposta

0

Forse il percorso del file è sbagliato. Ho usato il percorso SDcard come "/ mnt/sdcard /".

Non ricordo esattamente, ma puoi provare "/ mnt/sdcard/..." o "mnt/sdcard/...".

Oppure, è possibile ottenere il percorso SDCard utilizzando Environment.getExternalStorageDirectory().getAbsolutePath().

+0

si prega di consultare l'aggiornamento sopra, sembra che sia stato un problema tecnico con il mio telefono:/ – user1023420

+0

"o ottieni il percorso della sdcard usando Environment.getExternalStorageDirectory(). getAbsolutePath()" No, ed ecco perché: (peccato che abbiano chiuso questo) - user1023420 - potrebbe non essere il tuo telefono ... se hai "/ storage/sdcard0 "Samsung afferma che dobbiamo aggiungere"/external_sd/"quindi il nome del file - ma abbiamo verificato che funziona in modo diverso su diversi telefoni S3 - non funziona su alcuni, funziona in modo incoerente su altri –

Problemi correlati