zoukankan      html  css  js  c++  java
  • Android的JNI调用(三)

    注册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函数来释放对应的资源。

  • 相关阅读:
    css文本省略号
    javascript在数组的循环中删除元素
    ASP.NET MVC 微信公共平台开发之 微信接入
    ASP.NET Url重写
    通过FTP连接Azure上的网站
    UniversalApp启动页面设置
    ASP.NET页面动态添加js脚本
    使用HyperV虚拟机装系统
    使用一般处理程序HTTPHandler下载文件
    Egret Engine(白鹭引擎)介绍及windows下安装
  • 原文地址:https://www.cnblogs.com/jiayayao/p/7750504.html
Copyright © 2011-2022 走看看