繁体   English   中英

大于2GB的Android NDK(C ++)读写文件

[英]Read-Write File greater than 2GB Android NDK (C++)

对于某些人来说,这听起来很奇怪,而对于某些人来说,它却有些重复。 其实我没有用清晰的词找到答案,所以在这里发布一个问题。

我正在尝试创建android ndk项目,应用程序将在其中读取文件并写入另一个位置,例如; (复制和粘贴)。 我想为此使用NDK(C ++)。 但是在我开始之前,我的小脑袋里碰到了很多问题。

开始吧

  1. 在用C ++编写简单文件(读/写)程序时。 我发现没有64位等效查找功能来查找大于2Gb的文件。 因此可以在ndk中读取/写入2Gb以上大小的文件。 否则我们必须使用第三方库来实现这一目标。

    我正在关注这个话题。 JNI:使用C代码读取文本文件并返回sdk

  2. 在以下位置找到了某些信息: Android低级读取的SD卡大于2GB ,表明使用了

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

根据NDK 14,我在#include <unistd.h>发现了此功能

extern off64_t lseek64(int, off64_t, int);

我走在正确的道路上还是我错过了重要的事情。

最后,是否有关于android的文件大小或文件系统限制的信息。

UPDATE

使用以下标题

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>

用于创建文件

int fd = open(strFileName, O_CREAT | O_RDWR | O_LARGEFILE);      
off64_t offset = lseek64(fd,filesize,SEEK_SET);
char textToWrite[25];
sprintf(textToWrite, "%s", "WELCOME ANDRIOD NDK 15.0");
write(fd, &textToWrite, sizeof(textToWrite));

阅读

 int fd = open(strFileName, O_RDWR | O_LARGEFILE);
 off64_t offset = lseek64(fd,filesize,SEEK_SET);
 char textToRead[25];
 read(fd, &textToRead, sizeof(textToRead));

经过测试, filesize 4600000000 ,大于4 Gigs。

现在,这里出现了更多问题,因为我的目标是来自android minSDK 15及更高版本的应用。

  1. 执行以上功能将在大于15或更高的设备上工作。
  2. 我尚未定义_FILE_OFFSET_BITS 64

  3. 这样可以安全地处理android 15及更高版本上的大文件。

感谢您阅读。

直到最近才实现了所有off64_t变体: https : off64_t

看起来其中大多数功能受M支持,但有些功能仍位于N中。换句话说,取决于确切需要的功能,您可能无法在N之前的任何设备上执行此操作。

为了使这一点更加透明调用代码,你可以定义_FILE_OFFSET_BITS=64建设,然后头会自动替换时off32_t与变种off64_t时,在你的NDK API级别可供他们。

请注意,要使头文件足够新,您需要至少使用NDK r14,以便可以使用统一头文件 不过,该发行版中的统一标头存在一些问题,因此您可能还想尝试将于下周在I / O发行的r15 beta 2。

编辑:是的,您发布的代码很好。

暂无
暂无

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

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