jni对超过2G的大文件的处理,不过不成功

来源:互联网 发布:centos rm rf 恢复 编辑:程序博客网 时间:2024/04/30 10:02

加密一个文件,加密算法使用的是android自带的AES算法,从源码中提取出来即可。

希望将加密和文件处理的模块封装在so中,前前后后耗时不少,总算完成,加密流程不在这里阐述。这里记录下当时出现的一个问题。

测试的时候,发现只要是大视频进行加密后,总是出现加密再解密数据无法恢复的情况,证明了加密就是不正确。经过查验,发现是,只要是超过了2G的文件就必定会出现这种情况。当时就怀疑,为什么是2G?这么个凑巧的数字,猜测是因为系统是32位的原因,网上查查证明的猜测也木有错。

具体原因出现在fseek函数中,超过2G的文件的话,使用fseek来定位到END,必定是返回-1的失败值。问题就出在这里。

使用fseeko函数来替代fseek的使用,关于fseeko函数说明,可以看链接:

大文件处理

里面有介绍。


事实上在实验fseeko的时候,仍然会出现该问题,fseeko函数里面的偏移量参数是类型off_t默认仍然是32bit,和int一样,所以实际上fseeko的效果和fseek是一样的,所以这里我们主要要做的事情就是将off_t设置为64位。修改方法:

直接在 .cpp中定义 #define _FILE_OFFSET_BITS 64 恩,是木有用的,网上到处在介绍这种说法,但是直接再jni代码中这样设置,完全木有作用。感觉是肯定在android.mk中进行配置才可以。

在android.mk中添加了 LOCAL_CFLAGS += -D_FILE_OFFSET_BITS=64

仍然没有用。fseeko执行还是无法定位到超过2G的地址。

不知如何解决.................

原因找到了,为什么以上修改方法木有用呢?因为:

android不支持64位off_set

好吧,那么,要用lseek64的话,又要修改代码,算了,放弃。



0 0