【发布时间】:2014-11-14 03:42:12
【问题描述】:
我是 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
【问题讨论】:
-
我猜这是与内存使用有关的问题。你搜索过吗?
-
fopen() 采用 const char *,即 C 风格的空终止字符串而不是 jstring。使用 GetStringUTFChars()。
-
@AnirudhSharma 我到处找。我确实在某处读到过,其中一个变量可能为空。但我无法确认,因为即使我尝试在控制台上打印也会出现此错误
-
你检查过@ChrisStratton 的评论
-
编辑您的帖子以包含本机堆栈跟踪。
标签: java android c android-ndk java-native-interface