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
plik ma wartość null, a następnie ... – auselen
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
Czy mieć uprawnienie 'android.permission.WRITE_EXTERNEX_STORAGE'? – auselen