有没有办法从Android的FileDescriptor对象获取系统文件描述符(套接字或文件号为int)?我想直接在JNI代码中访问文件描述符而不使用任何Java包装器。
编辑:
我找到了getParcelFileDescriptorFD,并且FileDescriptor的int字段名为“descriptor”,media/jni/android_media_MediaPlayer.cpp
中的示例用法,func定义在frameworks/base/core/jni/android_util_Binder.cpp
,字段本身在libcore/luni/src/main/java/java/io/FileDescriptor.java
但这不是官方记录的API的一部分。是否有记录在案的“正确”方法?
答案 0 :(得分:5)
dalvik/libcore/
中的原生代码使用jniGetFDFromFileDescriptor
中的java_io_FileDescriptor.c
,但您不应该自己调用它,因为它不是稳定的API。你可以复制&粘贴该代码,但你真的想在这之前三思而后行。使用JNI访问实现细节只是要求您的代码在将来意外中断!
更好的选择是:
如果可以,请将I / O保留在Java端。
如果您必须在本机端进行I / O(如在媒体播放器的情况下)保留本机端的I / O:呼叫打开(2 )或者那边的任何东西,把fd保持为int而不是弄乱FileDescriptor对象,如果你把任何东西传回给Java传递int或你自己的对象(除了传回来之外没有任何意图用它)到您的原生代码。)
这两个选择今天起作用,并且不会因为您无法控制的Android实施细节的更改而意外中断。