【问题标题】:Read-Write File greater than 2GB Android NDK (C++)大于 2GB 的读写文件 Android NDK (C++)
【发布时间】:2017-05-08 05:10:25
【问题描述】:

这对某些人来说听起来很奇怪,而对某些人来说会很抱歉。实际上我没有用清晰的语言找到我的答案,所以在这里发布一个问题。

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

开始吧

  1. 在用 c++ 编写一个简单的文件(读/写)程序时。我发现没有 64 位等效的查找函数来查找大于 2Gb 的文件大小。那么是否可以使用 ndk 在 android 中读取/写入大小为 2Gb 的文件。或者我们必须使用第三方库来实现这一点。

    我正在关注这个帖子。 JNI: Reading a text file in C code and returning to sdk

  2. 在以下位置找到某些信息: Android low-level read of SD card greater than 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的文件大小或文件系统限制的信息。

更新

使用以下标题

#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));

使用大于 4 Gigs 的 filesize 4600000000 测试。

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

  1. do above 功能适用于大于 15 及以上的设备。
  2. 我没有定义_FILE_OFFSET_BITS 64

  3. 这种方式在 android 15 及更高版本上处理大文件是否安全。

感谢您阅读。

【问题讨论】:

  • 你还需要寻找吗?你说你找到了你需要的功能。你测试过吗?
  • 您认为复制粘贴 2gb 文件是个好方法吗?保存文件路径并使用它而不是在路径中复制不是更好吗?
  • 实际上任务有点不同,为了便于理解,我提到了复制和粘贴。我还在测试它。
  • 为什么在 C++ 和 JNI 中?您可以使用 RandomAccessFile 在 Java 中查找 64 位。
  • @EJP 这是我项目的要求

标签: android c++ android-ndk java-native-interface


【解决方案1】:

直到最近才实现所有off64_t 变体:https://android.googlesource.com/platform/bionic/+/master/libc/libc.map.txt

看起来大部分是 M 支持的,但有些仍然落在 N 中。换句话说,根据您需要的具体功能,您可能无法在任何早于 N 的设备上执行此操作。

为了使调用代码更加透明,您可以在构建时定义 _FILE_OFFSET_BITS=64,然后当它们在您的 NDK API 级别中可用时,标头会自动将 off32_t 变体替换为 off64_t

请注意,要拥有足够新的标头来执行此操作,您至少需要使用 NDK r14 才能使用unified headers。不过,该版本中的统一标头存在一些问题,因此您可能还想尝试下周在 I/O 上发布的 r15 beta 2。

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

【讨论】:

  • 那么,如果要操作大于 2gb 的文件并且要针对 API Level 15 以上,使用什么函数。
  • 你试过什么?我已经向您展示了 libc 中映射到每个函数支持的版本的所有函数的列表。这显示了lseeklseek64,我指出您可以使用_FILE_OFFSET_BITS=64 在支持它的目标API 上自动使用lseek64 代替lseek
  • 将 ndk14 与 studio 2.3 和 android N 模拟器一起使用,我已经完成了任务,但还有几个问题在我脑海中挥之不去,因此,我正在更新我的问题,请看一下。
猜你喜欢
  • 2014-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-19
  • 1970-01-01
  • 2020-09-16
  • 1970-01-01
  • 2012-10-12
相关资源
最近更新 更多