簡體   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