Android NDK之JNI陷阱
背景: 最近一个月一直在做移植库的工作,将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陷阱相关推荐
- linux android ndk r9b JNI 开发过程(COCOS2D-X配置)
我是小白 折腾了两天了. 终于成功第一次运行- 网上一堆教程乱死了然后其实现在android官方已经认定NDK为必要开发环境所以现在的配置其实很简单 另外Cocos2d-x的编译真是奇怪死了对一个只把 ...
- Android NDK 直播推流与引流,flutterui套件
if (mIsPushing) { mNativePush.fireVideo(bytes); } } 音频采集 音频采集基于 AudioRecord 实现,在一个子线程采集音频 PCM 数据,并将数 ...
- Android NDK开发之旅(2):一篇文章搞定Android Studio中使用CMake进行NDK/JNI开发
Android NDK开发之旅(2):一篇文章搞定android Studio中使用CMake进行NDK/JNI开发 (码字不易,转载请声明出处:http://blog.csdn.NET/andrex ...
- 【Android NDK 开发】JNI 方法解析 ( JNIEnv *env 参数 )
文章目录 一. JNI 方法解析 二. JNIEnv *env 参数解析 三. C 语言 环境中 JNIEnv *env 参数解析 四. C ++ 环境中 JNIEnv *env 参数解析 总结 : ...
- 【Android NDK 开发】Visual Studio 2019 使用 CMake 开发 JNI 动态库 ( 动态库编译配置 | JNI 头文件导入 | JNI 方法命名规范 )
文章目录 I . JNI 与 NDK 区别 II . Visual Studio 编译动态库 III. 配置 导入 jni.h 头文件 IV . IntelliJ IDEA Community Edi ...
- Android NDK JNI 的简单使用
为什么80%的码农都做不了架构师?>>> 1.why: 为啥学 NDK开发,其实是为了项目需要调用底层的一些C/C++的一些东西:另外就是为了效率更加高些: Android n ...
- Android之SDK、NDK、JNI和so文件
Android之SDK.NDK.JNI和so文件 1. SDK Android SDK(AndroidSoftware Development Kit),即Android软件开发工具包,And ...
- 安卓逆向_15( 三 ) --- Android NDK 开发【 jni 静态注册、JNI_OnLoad 动态注册】
Android Studio开发JNI示例:https://blog.csdn.net/wzhseu/article/details/79683045 JNI_动态注册_静态注册.zip : http ...
- 【学习Android NDK开发】Java通过JNI调用native方法
参考:Android NDK,sample/hello-jni示例项目 系统环境:Ubuntu 12.04 LTS 32-bit 1.准备工作 打开Eclipse,新建Android项目: Appli ...
最新文章
- css less 不要作用到子对象_不要盲目的在项目中使用LESS CSS
- hadoop配置安装
- 《C++入门经典(第6版)》——1.3 创建您的第一个程序
- 【机器学习】决策树算法
- (一) shario教程资料
- 微信开发系列之五 - 将SAP UI5应用嵌入到微信中
- SQLServer优化:SQLServer中NOLOCK关键字的用法介绍
- c 开发服务器的性能,高性能网络编程(三):下一个10年,是时候考虑C10M并发问题了...
- linux essid 异常,Linux无线ESSID:off/any的错误
- kafka之六:为什么Kafka那么快
- python 网络页面爬取
- Java大数据-Week2-Day1 面向对象基础
- 回答问题人工智能源码_回答21个最受欢迎的人工智能问题
- 学生管理系统 c语言版
- 投影演示辅助软件——zoomIt
- 数据库数据模型理解 概念数据模型 逻辑数据模型 物理数据模型区别和联系
- 计算机开机进不了bios,开机进不了bios,教您怎么解决win8开机进不了bios
- 第一次用 Mac git 遇到的一些问题及解决方法,记录一下
- solidworks属性管理器_SOLIDWORKS BOM快捷生成第一步 | 完善产品属性
- 关于android接入微信分享(以及app签名 the apk for your currently selected variant(app-release)
热门文章
- iptables 执行清除命令 iptables -F 要非常小心的
- 这么多年被第三方接入坑的那些事。。。关于md5签名和sha1证书的坑
- 使用tar或dd等完成Linux系统备份恢复
- [转]关于ORA-00979 不是 GROUP BY 表达式错误的解释
- Office Word Excel PPT Addin 插件开发
- 计算机组成原理中机器码怎么看,《计算机组成原理》汇编指令机器码对应列表...
- 所有配置_明年起,所有新车都要强制增加一项配置!不安装可能会导致...
- 【机器人】四元数与旋转矩阵的转换关系
- 多个服务器数据互通_数据中心
- delphi 软件在线人数统计_【大学分析】计算机爆满,软件爆冷!这所985大学考研分数截然不同!...