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

时间:2017-05-08 05:10:26

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

这对某些人来说听起来很奇怪,并且有些人对此感到遗憾。实际上我没有用清晰的单词找到答案,所以在这里发一个问题。

我正在尝试创建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);
    
  3. 根据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. 以上功能将适用于大于15及以上的设备。
    2. 我尚未定义_FILE_OFFSET_BITS 64

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

    4. 感谢您阅读。

1 个答案:

答案 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.

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