在Android中,FileDescriptor的实际系统文件描述符(作为int)是什么?

3
有没有一种方法可以从Android的FileDescriptor对象中获取系统文件描述符(socket或文件号作为int)?我想在JNI代码中直接访问文件描述符,而不使用任何Java包装器。
编辑: 我已经找到了getParcelFileDescriptorFD,并且FileDescriptor有一个名为“descriptor”的int字段,在media / jni / android_media_MediaPlayer.cpp中有示例用法,函数定义在frameworks / base / core / jni / android_util_Binder.cpp中,字段本身位于libcore / luni / src / main / java / java / io / FileDescriptor.java中。
但这不是官方文档化的API的一部分。是否有文档化的“正确”方法来做到这一点?

FileDescriptor来自于java.io,而不是Android库。 - RickNotFred
1个回答

5
本地代码在 dalvik/libcore/ 中使用 java_io_FileDescriptor.c 中的 jniGetFDFromFileDescriptor,但您不应该自己调用它,因为它不是稳定的 API。您可以复制和粘贴该代码,但在这样做之前确实需要三思。使用 JNI 访问实现细节只会导致您的代码在未来被意外破坏!
更好的选择是:
1. 如果可能,请将 I/O 留在 Java 端。 2. 如果您必须在本地端进行 I/O(例如媒体播放器),请保持 I/O 在本地端:在本地端调用 open(2) 或其他类似方法,将 fd 保留为整数而不是使用 FileDescriptor 对象,并且如果您返回任何东西给 Java,请传递 int 或您自己的对象(仅用于向下传递到本地代码)。
这两种选择今天就可以使用,并且不会被 Android 实现细节的更改意外破坏,而您无法控制这些更改。

谢谢您的回答,但它并没有真正帮助到我 :)我完全意识到使用内部实现细节是不好的,但目前我没有其他方法 - 由于Android的工作方式(它来自ContentResolver),我只有FileDescriptor。我希望我可以在Java端进行I/O操作,但似乎没有办法将FD转换为RandomAccessFile或等效物 - 我只能从FD创建“单向”InputStream,但我需要在我的代码中使用seek()(skip()无法完成任务)。我现在已经使用了FileDescriptor.descriptor(就像android_media_MediaPlayer.cpp一样),直到有更好的方法出现。 - maciej
值得在Sun的bug数据库中提交一个错误,认为RandomAccessFile应该有一个以FileDescriptor为参数的构造函数,然后在Android的bug数据库中提交一个错误,引用Sun的bug。 - Elliott Hughes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接