为什么自己的NDK/JNI工程编译的Sqlite3,打开2G以上数据文件的结果不正确?
环境:Eclipse,NDK/JNI,Sqlite3.24.0源码
原因:因公司项目需要在Android上访问Sqlite3数据文件,所以在NDK工程中直接加入Sqlite3源码编译出.so文件。并用JNI封装相应的接口类供JAVA调用。
现象1:对小于2G的Sqlite3数据文件(在PC上生成并严格测试后,再拷贝到Android手机的机身存储)进行“增删改查”,一切正常。对大于2G的Sqlite3数据文件进行“增删改查”,则操作会部分失败。
现象2:以2G为分界线,存储在2G范围之内的数据,正确查询;查询超出2G范围的数据,查询出错。
对大于2G的Sqlite3数据文件:
排查1:一开始以为是Sqlite3对超过2G文件的支持性问题,但通过阅读并跟踪Sqlite3源码,基本能排除这个原因,因为Sqlite3的源码编写得非常规范严谨,已经内置支持对Android-大文件的支持。(见Sqlite3源码“lseek”关键字所处的注释);
排查2:在相同的手机环境下,用JAVA代码调用系统自带的Sqlite3类来操作该“大于2G的Sqlite3数据文件”,则操作正常。且:手机自带的Sqlite3版本比我用NDK编译的版本还要低,显然不是Sqlite3源码版本问题;
问题:为什么自己在工程中编译的Sqlite3,不能正确操作超过2G的数据库文件?
哪位同行也遇过类似问题,望不吝指教!!!
补充说明:
1、考虑性能问题,项目是用NDK/C++来开发核心引擎,封装出JNI类供JAVA业务代码调用,所以肯定不能使用Android自带的Sqlite3库;
2、封装出的.so文件,操作2G以内的数据库,已通过多个项目实践,没有任何问题;