文件操作JNI

时间:2014-11-14 03:42:12

标签: java android c android-ndk java-native-interface

我是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 

2 个答案:

答案 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完成。