我是android和JNI的新手。我想访问设备中的文件。我已经为Manifest添加了权限,但它不起作用。
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 :(得分: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。
答案 1 :(得分:0)
您没有检查任何这些来电的结果。 JNi编程需要极端防御,fopen()
也可以返回null。
很难理解你为什么要使用fopen()
或JNI,而这一切都可以用Java完成。