加密一个文件,加密算法使用的是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的地址。
不知如何解决.................
原因找到了,为什么以上修改方法木有用呢?因为:
好吧,那么,要用lseek64的话,又要修改代码,算了,放弃。