注册JNI函数

  注册之意就是将Java层的native函数与JNI层对应的实现函数关联起来,这样在调用Java层的native函数时,就能顺利转到JNI层对应的函数执行。

(1)静态注册

  根据函数名来找对应的JNI函数,需要java工具程序javah参与;

  缺点是每个class都需要使用javah生成一个头文件,并且生成的名字人很长书写不便;初次调用时需要根据名字搜索对应的JNI层函数来建立关联关系,会影响运行效率。

(2)动态注册

  使用AndroidRunTime类提供的registerNaitveMethods将getMethods来完成注册工作,实际上最终调用的是(*env)->RegisterNative(env, clazz, gMethods, numMethods)。那么何时调用注册函数呢?一般Java层调用System.loadLibrary的时候,JNI层会调用JNI_OnLoad,动态注册工作在这里完成。

关于JNIEnv:

  JNIEnv是一个线程相关的,也就是说线程A有个JNIEnv,线程B有个JNIEnv。由于线程相关不能在B线程中去访问线程A的JNIEnv结构体。但是全进程只有一个JavaVM对象,所以可以保存并且在任何地方使用都没有问题。

  调用JavaVM的AttachCurrentThread函数,就可以得到这个线程的JNIEnv结构体。这样就可以在后台线程中回调Java函数。在后台线程退出前,需要调用JavaVM的DetachCurrentThread函数来释放对应的资源。

最新文章

  1. iOS开发-UI 从入门到精通(四)
  2. CLI:使用Go开发命令行应用
  3. 数据库数据怎样导出成Excle表格或Word文档?
  4. 最长子串 FZU2118
  5. MySQL 存储过程实例 与 ibatis/mybatis/hibernate/jdbc 如何调用存储过程
  6. WPF中嵌入Office编辑器(支持Word、Excel、PPT、Visio等)
  7. Javascript版选择下拉菜单互移且排序
  8. Android NDK开发Crash错误定位[转]
  9. 最大流Dinic
  10. 7款纯CSS3实现的炫酷动画应用|慕课网只学有用的!
  11. VIM设置-发现VIM的美
  12. 开篇 Android系统的体系结构
  13. ubuntu下配置Apache+mod_wsgi+Django项目(个人测试)
  14. MySQL——修改用户密码 | 移除权限
  15. [转]gitlab配置通过smtp发送邮件(QQ exmail腾讯企业为例)
  16. + CategoryInfo : NotSpecified: (:) [], PSSecurityException + FullyQualifiedErrorId : RuntimeException
  17. 如何在Ubuntu上安装LAMP服务器系统?
  18. cf571B Minimization (dp)
  19. 走进JVM之一 自己编译openjdk源码
  20. 用《舌尖2》去理解C#中的多态和开闭原则

热门文章

  1. K先生的博客
  2. JavaScript try-catch语句(错误处理)
  3. 在android工程中,res目录下又有anim、drawable、layout、menu、raw、values和xml文件夹,分别用来保存?
  4. exception tomcat startup.bat 闪退
  5. oracle 网络配置 及 pl/sql 连接配置
  6. mysql 客户端
  7. LeetCode题解之To Lower Case
  8. css.map作用
  9. webpack的require是如何工作的?
  10. Aheadof Time Compilation(AOT) vs (JIT)Just In Time compilation approach