我已经解决了在NDK上编写代码时遇到的一个问题,但我不确定解决方案是否规范,或者是否有一种规范的方法。首先,描述一下我所做的事情:
看来我无法使用Java的文件或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如何通过在其公共方法中传递对象来访问这个可能是私有的字段呢?我想知道吗?
发布于 2014-07-30 22:03:38
ParcelFileDescriptor如何访问这个可能是私有的字段?
整数文件描述符根本不是java.io.File
类的一部分。该类包装文件名,可用于文件系统中不存在或甚至不存在的名称。当您使用Java File
对象时,不会打开Linux file
。因此,为了打开文件,我们使用了许多类中的一个,如FileInputStream
、FileReader
等。
在核心Java中定义的FileDescriptor
类可以用于打开文件的一些操作;它确实“知道”实际的int
文件描述符(您可以检查它的源代码),但是Android隔离了这个数字,正如@danske正确解释的那样。
android.os.ParcelFileDescriptor
使用系统库libnativehelper.so
查找值,您也可以看到相关的源代码。实际上,您也可以查找nativehelper,的来源。
发布于 2014-07-30 11:38:09
Java.io.File和Java.io.FileDescriptor是Sun定义的基本Java的一部分,从设计上来说,它从不向系统公开整数文件描述符。这很可能是为了抽象,即使Java程序可移植到不使用简单整数标识打开的文件描述符的自定义操作系统。
另一方面,android.os.ParcelFileDescriptor是一个特定于Android的API,而基于Linux的Android则总是使用整数来建模文件描述符,所以公开它是可以的。
不过,您可能不需要确切地知道ParcelFileDescriptor是如何执行其魔力的。只是我的两分钱。
https://stackoverflow.com/questions/25025113
复制相似问题