在Java / Android中,为什么我能从ParcelFileDescriptor获取整数文件描述符?

时间:2014-07-29 21:15:38

标签: java android android-ndk

我已经解决了在NDK上编码时遇到的问题,但我不确定解决方案是规范的,还是有一种规范的方法可以做到这一点。首先描述我的所作所为:

看来我无法使用Java的File或FileDescriptor对象访问整数文件描述符值: http://developer.android.com/reference/java/io/File.html http://developer.android.com/reference/java/io/FileDescriptor.html

但我可以使用Android的ParcelFileDescriptor对象: http://developer.android.com/reference/android/os/ParcelFileDescriptor.html

所以我可以用这种方式得到整数fd到我的本机代码:

pfd = ParcelFileDescriptor.open(new File("blah"), MODE_WRITE_ONLY);
myNativeFunction(pfd.getFd());

为什么这样做?文件描述符整数字段不会在File对象中是私有的,因为即使我拥有该对象,我也无法访问它吗?那么ParcelFileDescriptor如何通过在其公共方法中传递对象来访问这个可能的私有字段呢?我甚至想知道吗?

2 个答案:

答案 0 :(得分:3)

Java.io.File和Java.io.FileDescriptor是Sun定义的基本Java API的一部分,根据设计, never 将整数文件描述符暴露给。这可能是为了抽象,即使Java程序可移植到不使用简单整数来识别打开的文件描述符的自定义操作系统。

另一方面,android.os.ParcelFileDescriptor是一个特定于Android的API,而在基于Linux的Android上,整数总是用于建模文件描述符,因此可以公开它。

您可能不需要确切知道ParcelFileDescriptor如何执行其魔力。我的2美分。

答案 1 :(得分:1)

  

ParcelFileDescriptor如何访问这个可能的私有字段

整数文件描述符根本不属于java.io.File类。此类包装文件名,可用于文件系统上不存在甚至不存在的名称。使用Java File对象时,不会打开Linux file。因此,要打开文件,我们会使用许多类之一,例如FileInputStreamFileReader等。

在核心Java API中定义的

FileDescriptor类可用于对打开文件的一些操作;它确实"知道"实际的int文件描述符(您可以检查其source code),但Android SDK隔离了此数字,正确解释了 @danske

android.os.ParcelFileDescriptor使用系统库libnativehelper.so来查找值,您也可以看到相关的source code。您实际上也可以查找 nativehelper 的来源。