Android: File IO с SD-карты с использованием NDK

Я пытаюсь записать в выходной файл с помощью 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; } 

Причина, по которой тип возврата является двойным, заключается в том, что я планирую использовать эту функцию для другой цели, но сначала я пытаюсь выполнить файл io. В logcat я получаю следующую ошибку:

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

Забавно, когда я пытаюсь писать или читать из одного и того же файла в активности вызывающего, используя java-файл io, у меня нет никаких проблем. И я убедился, что у меня есть права на запись в файле манифеста. Кроме того, если я удалю строку FILE* file ... и попытаюсь использовать возвращаемое двойное значение из функции, программа будет работать нормально. Может ли кто-то помочь? Может ли проблема быть чем-то, что я должен включить в файлы Android.mk или Application.mk, например?

ОБНОВЛЕНИЕ Я использую примечание 2 галактики Samsung, если это имеет значение

UPDATE2

Вот полный код:

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

Вот родной метод:

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

Вот 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) 

И вот манифест:

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

ОБНОВИТЬ

Последнее обновление: я пробовал один и тот же код на чужом телефоне, а также заметку галактики 2, и это сработало. Кажется, проблема была в моем телефоне. вздох

Solutions Collecting From Web of "Android: File IO с SD-карты с использованием NDK"

Возможно, путь к файлу неверен. Я использовал SDcard путь как «/ mnt / sdcard /».

Я точно не помню, но вы можете попробовать «/ mnt / sdcard / …» или «mnt / sdcard / …».

Или вы можете получить путь Environment.getExternalStorageDirectory().getAbsolutePath() используя Environment.getExternalStorageDirectory().getAbsolutePath() .