【问题标题】:File operations JNI文件操作 JNI
【发布时间】: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


【解决方案1】:
// 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。

【讨论】:

  • 完全按照您的建议进行了尝试。它是相同的致命信号错误。日志也不显示。
  • “日志不显示” - 甚至Log.i("java ", path)?顺便说一句,您的 Java 文件是否以 package package.MainActivity 开头?
  • 对不起,当我说日志时,我的意思是 _android_log_print 。但这现在起作用了。因为我把它放在文件操作之后,它没有被执行。文件操作 open 总是返回 null。
  • 检查你是否可以用Java写入这个文件,这将解决权限问题。
  • 我可以用 Java 编写文件。所以我想这不是权限问题
【解决方案2】:

您没有检查任何这些调用的结果。 JNi 编程需要极端防御,fopen() 也可以返回 null。

很难理解为什么要使用 fopen() 或者根本不使用 JNI,而这一切都可以在 Java 中完成。

【讨论】:

  • 我必须在 JNI 中使用 ffmpeg。所以我需要访问 JNI 本身的文件。
猜你喜欢
  • 2012-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-23
  • 2012-05-29
  • 1970-01-01
相关资源
最近更新 更多