繁体   English   中英

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

[英]In Java / Android, why am I able to get an integer file descriptor from ParcelFileDescriptor?

我已经解决了在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如何才能访问此假定的私有字段? 我想知道吗?

Java.io.File和Java.io.FileDescriptor是Sun定义的基本Java API的一部分,根据设计,它们从不向其公开整数文件描述符。 这样做可能是出于抽象的目的,即使Java程序可移植到不使用简单整数来标识打开的文件描述符的定制操作系统。

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

但是,您可能不需要确切地了解ParcelFileDescriptor如何执行其魔术。 只是我的2美分。

ParcelFileDescriptor如何访问这个大概的私有字段

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

核心Java API中定义的FileDescriptor类可用于对打开的文件进行某些操作。 它确实“知道”实际的int文件描述符(您可以检查其源代码 ),但是Android SDK会隔离此数字,如@danske正确解释的那样。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM