2014-11-14 4 views
-1

Я новичок в android и JNI. Я хочу получить доступ к файлам на устройстве. Я добавил разрешения на манифест, но он не работает.Операции с файлами JNI

код Java:

public class MainActivity extends ActionBarActivity { 
public native String setFilePath(String path); 

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


    TextView tv = new TextView(this); 

    tv.setText("1111"); 


    setContentView(tv); 
    String path = Environment.getExternalStorageDirectory().getPath()+"/xyz"; 
    Log.i("java ", path); 
    setFilePath(path); 

} 
} 

Код C:

jint Java_package_MainActivity_setFilePath(JNIEnv* env, jobject this,jstring Path){ 



path = (*env)->GetStringUTFChars(env, Path , NULL) ; 
__android_log_print(ANDROID_LOG_DEBUG, "SO", "fopen(%s)", path); 
FILE* file = fopen(path,"ab+"); 
(*env)->ReleaseStringUTFChars(env, Path , path); 
fputs("Testing!\n", file); 
fclose(file); 
return 0; 
} 

ошибка появляется как:

Fatal signal 11 (SIGSEGV) at 0x0000000c (code=1), thread 16152 
+0

Я думаю, что это проблема, связанная с использованием памяти. Вы искали ее? –

+2

fopen() принимает const char *, то есть строку с нулевым завершением в стиле C, а не в jstring. Используйте GetStringUTFChars(). –

+0

@ АнирудШарма Я везде искал. Я где-то читал, что возможно, что одна из переменных равна нулю. Но я не могу подтвердить это, потому что эта ошибка возникает, даже когда я пытаюсь ее распечатать на консоли – pheno

ответ

0
// Path is an jstring passed as an arg of a function 
char *path = (*env)->GetStringUTFChars(env, Path , NULL) ; 
__android_log_print(ANDROID_LOG_DEBUG, "SO", "fopen(%s)", path); 
FILE* file = fopen(path,"ab+"); 
(*env)->ReleaseStringUTFChars(env, Path , path); 
fputs("Testing!\n", file); 
fclose(file); 

Если он не работает, после того, что печатается на logcat.

+0

Пробовал именно то, что вы предложили. Его же ошибка фатального сигнала. Журнал также не отображается. – pheno

+0

«Журнал не отображается» - даже 'Log.i (« java », path)'? Кстати, ваш файл Java начинается с 'package package.MainActivity'? –

+0

Извините, когда я сказал журнал, я имел в виду _android_log_print. Но сейчас это работает. потому что я разместил его после операций с файлом, он не был выполнен. Это открытая операция файла, которая всегда будет возвращать значение null. – pheno

0

Вы не проверяете результат какого-либо из этих вызовов. Программирование JNi требует крайней защиты, и fopen() также может возвращать нуль.

Трудно понять, почему вы используете fopen() или действительно JNI вообще, когда все это можно сделать на Java.

+0

Мне нужно использовать ffmpeg в JNI. Поэтому мне нужно получить доступ к файлам в самом JNI. – pheno