Android低级读取大于2GB的SD卡

8
我的Android应用程序试图通过访问实际设备(在我的情况下是 /dev/block/vold/179:1)来读取SD卡的物理扇区。(当然,这是在已经root过的手机上)
我可以将该设备作为FileInputStream打开,并从中读取数据。但是,我似乎无法读取超过2GB的数据(我的存储卡容量为16GB)。
这是因为Android不支持大于2GB的文件吗?如果是这样,那么为什么像 position() 和 skip() 这样的函数接受 long 参数呢?
有人能给我建议如何读取超过2GB的数据吗?

似乎此行为仅会出现在 Android 3.0 之前的版本。我尝试在平板电脑(3.1)上运行我的应用程序,它确实可以读取超过 2GB 的 SD 卡(以及内部存储器)。 - Dmitry Brant
3
没错,蜂窝结构之前的任何版本都会限制在2GB,因为I/O操作使用的是lseek而不是lseek64。你可以访问http://code.google.com/p/android/issues/detail?id=21696查看该问题的详细信息。 - Matt
1个回答

1

尝试使用本地(JNI)库创建并调用__llseek()函数

int __llseek(unsigned int fd, unsigned long offset_high,
             unsigned long offset_low, loff_t *result,
             unsigned int whence);

我认为你应该在你的代码中添加原型,因为我怀疑没有直接包含(sys/linux-unistd.h)。

当然,这种方法有点不文档化 :) 但是你可以在Android 3之后使用Java,以及在此之前使用这个技巧。

man _llseek获取更多信息。


我本来希望能够避免使用JNI来实现这些目的,但是看来我不得不咬紧牙关了,因为这确实有效。谢谢! - Dmitry Brant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接