Android NDK之JNI陷阱
2014-03-03 15:20
106 查看
经常遇到到问题:
问题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。
问题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。
相关文章推荐
- Android NDK之JNI陷阱
- Android NDK之JNI陷阱
- Android NDK之JNI陷阱
- Android NDK之JNI陷阱
- Android NDK之JNI陷阱
- Android NDK之JNI陷阱
- Android NDK之JNI陷阱
- [Android NDK]命令行编译C++代码(JNI)的方式(windows和linux通用)
- 一个简单的OpenGL ES 3.0 示例 (Android NDK jni)
- Android NDK探究奥秘一:Android Studio创建第一个JNI项目
- android NDK学习篇5之hello-jni——jni中头文件的自动生成
- Android NDK之----- 在jni中创建java类对象
- Android NDK的C/C++代码中利用JNI回调实现字符编码转换
- Android NDk-JNi开发(一)NDK环境变量的配置
- JNI(2) Android NDK 环境搭建与使用
- Android NDK(九):JNI实践总结
- 【学习Android NDK开发】native code通过JNI调用Java方法
- android ndk开发:JNI中怎的引用so动态库中的函数
- Android NDK R8C 重新编译jni问题
- android NDK 教程一(初识JNI--hello world)