背景: 最近一个月一直在做移植库的工作,将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陷阱相关推荐

  1. linux android ndk r9b JNI 开发过程(COCOS2D-X配置)

    我是小白 折腾了两天了. 终于成功第一次运行- 网上一堆教程乱死了然后其实现在android官方已经认定NDK为必要开发环境所以现在的配置其实很简单 另外Cocos2d-x的编译真是奇怪死了对一个只把 ...

  2. Android NDK 直播推流与引流,flutterui套件

    if (mIsPushing) { mNativePush.fireVideo(bytes); } } 音频采集 音频采集基于 AudioRecord 实现,在一个子线程采集音频 PCM 数据,并将数 ...

  3. Android NDK开发之旅(2):一篇文章搞定Android Studio中使用CMake进行NDK/JNI开发

    Android NDK开发之旅(2):一篇文章搞定android Studio中使用CMake进行NDK/JNI开发 (码字不易,转载请声明出处:http://blog.csdn.NET/andrex ...

  4. 【Android NDK 开发】JNI 方法解析 ( JNIEnv *env 参数 )

    文章目录 一. JNI 方法解析 二. JNIEnv *env 参数解析 三. C 语言 环境中 JNIEnv *env 参数解析 四. C ++ 环境中 JNIEnv *env 参数解析 总结 : ...

  5. 【Android NDK 开发】Visual Studio 2019 使用 CMake 开发 JNI 动态库 ( 动态库编译配置 | JNI 头文件导入 | JNI 方法命名规范 )

    文章目录 I . JNI 与 NDK 区别 II . Visual Studio 编译动态库 III. 配置 导入 jni.h 头文件 IV . IntelliJ IDEA Community Edi ...

  6. Android NDK JNI 的简单使用

    为什么80%的码农都做不了架构师?>>>    1.why: 为啥学 NDK开发,其实是为了项目需要调用底层的一些C/C++的一些东西:另外就是为了效率更加高些: Android n ...

  7. Android之SDK、NDK、JNI和so文件

    Android之SDK.NDK.JNI和so文件 1.     SDK Android SDK(AndroidSoftware Development Kit),即Android软件开发工具包,And ...

  8. 安卓逆向_15( 三 ) --- Android NDK 开发【 jni 静态注册、JNI_OnLoad 动态注册】

    Android Studio开发JNI示例:https://blog.csdn.net/wzhseu/article/details/79683045 JNI_动态注册_静态注册.zip : http ...

  9. 【学习Android NDK开发】Java通过JNI调用native方法

    参考:Android NDK,sample/hello-jni示例项目 系统环境:Ubuntu 12.04 LTS 32-bit 1.准备工作 打开Eclipse,新建Android项目: Appli ...

最新文章

  1. css less 不要作用到子对象_不要盲目的在项目中使用LESS CSS
  2. hadoop配置安装
  3. 《C++入门经典(第6版)》——1.3 创建您的第一个程序
  4. 【机器学习】决策树算法
  5. (一) shario教程资料
  6. 微信开发系列之五 - 将SAP UI5应用嵌入到微信中
  7. SQLServer优化:SQLServer中NOLOCK关键字的用法介绍
  8. c 开发服务器的性能,高性能网络编程(三):下一个10年,是时候考虑C10M并发问题了...
  9. linux essid 异常,Linux无线ESSID:off/any的错误
  10. kafka之六:为什么Kafka那么快
  11. python 网络页面爬取
  12. Java大数据-Week2-Day1 面向对象基础
  13. 回答问题人工智能源码_回答21个最受欢迎的人工智能问题
  14. 学生管理系统 c语言版
  15. 投影演示辅助软件——zoomIt
  16. 数据库数据模型理解 概念数据模型 逻辑数据模型 物理数据模型区别和联系
  17. 计算机开机进不了bios,开机进不了bios,教您怎么解决win8开机进不了bios
  18. 第一次用 Mac git 遇到的一些问题及解决方法,记录一下
  19. solidworks属性管理器_SOLIDWORKS BOM快捷生成第一步 | 完善产品属性
  20. 关于android接入微信分享(以及app签名 the apk for your currently selected variant(app-release)

热门文章

  1. iptables 执行清除命令 iptables -F 要非常小心的
  2. 这么多年被第三方接入坑的那些事。。。关于md5签名和sha1证书的坑
  3. 使用tar或dd等完成Linux系统备份恢复
  4. [转]关于ORA-00979 不是 GROUP BY 表达式错误的解释
  5. Office Word Excel PPT Addin 插件开发
  6. 计算机组成原理中机器码怎么看,《计算机组成原理》汇编指令机器码对应列表...
  7. 所有配置_明年起,所有新车都要强制增加一项配置!不安装可能会导致...
  8. 【机器人】四元数与旋转矩阵的转换关系
  9. 多个服务器数据互通_数据中心
  10. delphi 软件在线人数统计_【大学分析】计算机爆满,软件爆冷!这所985大学考研分数截然不同!...