2013-03-07 18 views
9

Próbuję zapisać na pliku wyjściowym za pomocą NDK i nie wydaje się działać. Kod pisałem wygląda następująco:Android: Plik IO z karty SD za pomocą 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; 
} 

Powodem typ zwracany jest podwójne, jest to, że zamierzam na temat korzystania z funkcji w innym celu, ale staram się plik IO pierwszy. W LogCat, otrzymuję następujący błąd:

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

Zabawne jest, gdy próbuję pisać lub czytać z tego samego pliku aktywności rozmówcy przy użyciu plików Java IO, ja nie mam żadnych problemów. I upewniłem się, że mam uprawnienia do zapisu w pliku manifestu. Ponadto, jeśli usuniemy linię FILE* file ... i spróbuję użyć zwróconej podwójnej wartości z funkcji, program działa poprawnie. Czy ktoś może Ci pomóc? Czy problem może dotyczyć np. Plików Android.mk lub Application.mk?

UPDATE używam Samsung Galaxy Note 2, jeśli to czyni żadnej różnicy

Update2

Oto pełny kod: działalność

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

} 

Oto metoda natywna:

/* 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; 
} 

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

I tu jest oczywisty:

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

Ostatnia aktualizacja: Próbowałem tego samego kodu na cudzym telefonie , także notatka galaktyki 2, i zadziałało. Wygląda na to, że problem dotyczył mojego telefonu. sigh

+0

plik ma wartość null, a następnie ... – auselen

+0

Plik ma wartość zerową, ale jak to ma sens? Jeśli plik nie znajduje się w katalogu, fopen utworzy go, a następnie zapisze na nim. Ponadto, jak powiedziałem w pytaniu, użycie tej samej dokładnej ścieżki w pliku aktywacji Main.java nie daje mi żadnego błędu (używając 'File f1 = new File ("/sdcard/textTest.txt ")' – user1023420

+0

Czy mieć uprawnienie 'android.permission.WRITE_EXTERNEX_STORAGE'? – auselen

Odpowiedz

0

Być może ścieżka pliku jest nieprawidłowa. Użyłem ścieżki SDcard jako "/ mnt/sdcard /".

Nie pamiętam dokładnie, ale możesz spróbować "/ mnt/sdcard/..." lub "mnt/sdcard/...".

Lub można uzyskać ścieżkę SDCard, używając Environment.getExternalStorageDirectory().getAbsolutePath().

+0

Proszę zobaczyć powyższą aktualizację, wygląda na to, że to był błąd z moim telefonem:/ – user1023420

+0

"lub uzyskaj ścieżkę sdcard przy użyciu Environment.getExternalStorageDirectory(). getAbsolutePath()" Nie, i oto dlaczego: (źle to zamknęli) - user1023420 - to nie może być twój telefon ... jeśli masz "/ storage/sdcard0 "Samsung twierdzi, że musimy dołączyć"/external_sd/", a następnie nazwę pliku - ale sprawdziliśmy, że działa inaczej na różnych telefonach S3 - na niektórych kończy się niepowodzeniem, działa niekonsekwentnie na innych –

Powiązane problemy