Android NDK之JNI陷阱
来源:互联网 发布:淘宝第三方促销平台 编辑:程序博客网 时间:2024/05/14 04:30
背景: 最近一个月一直在做移植库的工作,将c代码到share library移植到Android平台。这就涉及到Android NDK(native develop kit)内容。这里只想记录下JNI(Java native interface)经常遇到到问题。
问题1. 忘记delete local reference。带New到方法(如:NewByteArray)这样到方法比较好辨认,需要手动调用DeleteLocalRef()来释放(返回值除外)。比较特殊的一个方法是:GetByteArrayELement必须要调用ReleaseByteArrayElements进行释放。当然如果你只是取bytearray中到byte,那么完全可以用GetByteArrayRegion实现。
问题2. 没有NewGlobalRef。 在不同线程调用java方法,需要保存jobject对象,这时需要对jobject对象做全局引用,否则会失效。
问题3. jbytearray的length。在JNI layer获取到jbytearray到长度是不对到,应该由java获取byte[]的length再传给C layer。否则C layer有可能获得到是乱码。
问题4. 线程问题。 不同线程使用JNIEnv*对象,需要AttachCurrentThread将env挂到当前线程,否则无法使用env。
问题5. javap 命令是对java的class文件操作;而javah命令需要在包名到上一层路径运行才行,否则无法生成.h文件。
问题6. 尽量避免频繁调用JNI或者是使用JNI传输大量到数据。
问题7. Reference Table overflow (max=1024) 或者是 Reference Table overflow (max=512)一定是因为忘记释放global reference或者local reference,请仔细检查代码。
问题8. 不要在windows下使用cygwin编译NDK code,那样会遇到arguments too long问题,因为windows路径长度有限制导致。虽然可以使用subst将路径映射为短路径,但是在编译时间和调试上,windows到孩子都是伤不起。同样到build,在windows下要15分钟左右,而在mac下只要5分多,相差3倍。调试JNI 代码到速度更是不用提了,差太多。
总结,JNI代码量其实不是很多,JNI作为一个数据传输层,它到作用仅仅是java和c直接到桥梁,但是如果处理不好将会是灾难,调试和找bug非常困难。
- Android NDK之JNI陷阱
- Android NDK之JNI陷阱
- Android NDK之JNI陷阱
- Android NDK之JNI陷阱
- Android NDK之JNI陷阱
- Android NDK之JNI陷阱
- android NDK开发之NDK与JNI
- Android之JNI和NDK
- android 之 JNI 调用 NDK
- Android NDK之JNI使用例子
- Android NDK编程之JNI探究
- Android NDK入门之Hello Jni
- Android NDK开发之Jni的数据类型
- Android JNI 开发之NDK环境配置
- Android JNI 开发之NDK环境配置
- 初识JNI之-Android Ndk环境搭建
- Android NDK开发之JNI基础知识
- Android NDK开发之Hello-JNI!
- MySQL详解--锁
- Jprofile(三) - 查看线程CPU耗时
- Android Studio常用手册
- Gulp Error: Cannot find module 'jshint/src/cli';
- Python: 在Unicode和普通字符串之间转换
- Android NDK之JNI陷阱
- 协方差
- caffe源码阅读1-blob.hpp
- jQuery批量修改h1标签内容
- 查看表空间sql
- 关于finish()后父类的刷新问题
- [从头读历史] 第305节 星球战争 BC2899 至 BC2800(公元前29世纪)
- 加载一级分类数据、加载即选中第一行
- django程序没有问题,保存远地测试数据库,save没问题,控制台也显示update成功,但是在数据库检索数据没有存进去