这对某些人来说听起来很奇怪,并且有些人对此感到遗憾。实际上我没有用清晰的单词找到答案,所以在这里发一个问题。
我正在尝试创建android ndk项目,其中应用程序将读取文件并写入另一个位置,例如; (复制和粘贴)。我想使用NDK(C ++)。但在我开始之前,我的小脑袋里面有很多问题。
让我们开始
用c ++编写简单文件(读/写)程序。我发现没有64位等效的搜索功能来寻找大于2Gb的文件大小。因此可以使用ndk在android中读取/写入大小为2Gb的文件。或者我们必须使用第三方库来实现这一目标。
我正在关注这个帖子。 JNI: Reading a text file in C code and returning to sdk
在以下位置找到某些信息: 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及更高版本的应用程序。
我尚未定义_FILE_OFFSET_BITS 64
这样可以安全地处理Android 15及更高版本的大文件。
感谢您阅读。
答案 0 :(得分:0)
并非所有off64_t
变体都在最近才实施:https://android.googlesource.com/platform/bionic/+/master/libc/libc.map.txt
看起来大多数都支持M,但有些仍然落在N.换句话说,根据您需要的确切功能,您可能无法在任何早于N的设备上执行此操作。
为了使调用代码更加透明,您可以在构建时定义_FILE_OFFSET_BITS=64
,然后当您的off32_t
变体可用时,标题会自动将off64_t
变体替换为S
NDK API级别。
请注意,为了使标题足够新,您需要至少使用NDK r14,以便使用unified headers。虽然该版本中存在统一标头的一些问题,因此您可能还想尝试下周将在I / O上发布的r15 beta 2.
编辑:是的,您发布的代码很好。