在系列(1)中讲到,Java与native code的操作有两种方式:(1)在Java中加载动态链接库(2)使用JNI Invocation inteface,在native code中创建JVM

JavaVM接口

第一种方式,在加载动态链接库的时候,JVM会调用JNI_OnLoad(JavaVM* jvm, void* reserved)(如果定义了该函数)。第一个参数会传入JavaVM指针。

第二种方式,在native code中调用JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args)可以得到JavaVM指针。

两种情况下,都可以用全局变量,比如JavaVM* g_jvm来保存获得的指针以便在任意上下文中使用。

Android系统是利用第二种方式Invocation interface来创建JVM的。

JNIEnv接口

JNI开发最常见的错误就是滥用了JNIEnv接口。需要强调的是JNIEnv是跟线程相关的。

在native method中,JNIEnv作为第一个参数传入。那么在JNIEnv不作为参数传入的时候,该如何获得它?JNI提供了两个函数:(*jvm)->AttachCurrentThread(jvm, (void**)&env, NULL)和(*jvm)->GetEnv(jvm, (void**)&env, JNI_VERSION_1_2)。两个函数都利用JavaVM接口获得JNIEnv接口,上面已经讲到如何获得JavaVM接口。

JNI规范也说明,可以将获得JNIEnv封装成一个函数。

1
2
3
4
5
6
JNIEnv* JNU_GetEnv()
{
    JNIEnv* env;
    (*g_jvm)->GetEnv(g_jvm, (void**)&env, JNI_VERSION_1_2);
    return env;
}

如何得到JavaVM,JNIEnv接口相关推荐

  1. java.vm.info_JNI完全指南(十)——JavaVM与JNIEnv

    JNI完全指南(十)--JavaVM与JNIEnv JNI完全指南版本:1 作者:陈小默 声明:禁止商业,禁止转载 十.JavaVM与JNIEnv 10.1 JNIEnv JNIEnv类型是一个指向全 ...

  2. 【Android 系统开发】Android JNI 之 JNIEnv 解析

    . jni.h文件 : 了解 JNI 需要配合 jni.h 文件, jni.h 是 Google NDK 中的一个文件, 位置是 $/android-ndk-r9d/platforms/android ...

  3. Android之ndk中JNIENV env->NewStringUTF (*env)->NewStringUTF

    JNIEnv是指向可用JNI函数表的接口指针,原生代码通过JNIEnv接口指针提供的各种函数来使用虚拟机的功能.JNIEnv是一个指向线程-局部数据的指针,而线程-局部数据中包含指向线程表的指针.实现 ...

  4. Android JNI 之 JNIEnv 解析

    jni.h文件 : 了解 JNI 需要配合 jni.h 文件, jni.h 是 Google NDK 中的一个文件, 位置是$/android-ndk-r9d/platforms/android-19 ...

  5. android native java_在Android Native层中创建Java虚拟机实例

    前言 Android应用中JNI代码,是作为本地方法运行的.而大部分情况下,这些JNI方法均需要传递Dalvik虚拟机实例作为第一个参数.例如,你需要用虚拟机实例来创建jstring和其他的Java对 ...

  6. JNI 实战全面解析

     项目决定移植一款C++开源项目到Android平台,开始对JNI深入研究. JNI是什么? JNI(Java Native Interface)意为JAVA本地调用,它允许Java代码和其他语言 ...

  7. Android系统启动过程全解析

    Android系统是一款基于Linux的移动操作系统,那么Android是如何启动起来的呢?本文就详细阐述Android系统的启动过程. 从内核之上,我们首先应该从文件系统的init开始,因为 ini ...

  8. 通过exe启动class

    通过exe启动class 昨天下载了号称纯java版的网游<海天英雄传>, 发现其将包括jvm.dll在内的所有组件及所有class全部封装使用,觉得这种方式比较可行,既保证了理论上的纯j ...

  9. 在Android Native层中创建Java虚拟机实例

    前言 Android应用中JNI代码,是作为本地方法运行的.而大部分情况下,这些JNI方法均需要传递Dalvik虚拟机实例作为第一个参数.例如,你需要用虚拟机实例来创建jstring和其他的Java对 ...

  10. 图解Android - Zygote, System Server 启动分析

    Init 是所有Linux程序的起点,而Zygote于Android,正如它的英文意思,是所有java程序的'孵化池'(玩过星际虫族的兄弟都晓得的).用ps 输出可以看到 >adb shell ...

最新文章

  1. 六、springboot整合swagger
  2. 人工智能赋能中国健康医疗服务
  3. #51CTO学院四周年# 成长路上的我和你
  4. Gnuplot使用x11终端自动注销问题
  5. YTU_3137: 动态规划基础题目之拦截导弹
  6. Ardino基础教程 24_RGB全彩LED
  7. win10删除开机密码_新版WIN10 如何取消开机密码的操作
  8. 关于python进行批量数据备份及部署
  9. Nginx的初步安装
  10. Python isdigit() isalnum()
  11. 特斯拉要退市!马斯克内部信:不受华尔街摆布;股价大涨10%
  12. 基于Python从头开始使用 RMSProp 进行梯度下降
  13. 安装KeMotion3 03.16d时遇到的问题
  14. 虚拟机xfs文件系统因根分区爆满损坏修复
  15. lookup基础用法
  16. js编写五种基础排序(冒泡排序、选择排序、插入排序、快速排序、sort)
  17. 自编码神经网络相似图片检索
  18. 【youcans 的 OpenCV 例程200篇】153. 边缘检测之 DoG 算子
  19. 企业管理项目应该选择什么项目管理系统?
  20. 纯前端实现xls表格下载

热门文章

  1. 小马哥---深度解析mtk刷机平台报错解决 4032 8038等
  2. 拉普拉斯方程的解matlab,急求用matlab编写解拉普拉斯方程的程序
  3. 快手上市,有一批员工平均身家超3200万,但追赶抖音没那么简单
  4. 联邦学习后门攻击代码阅读——backdoors101
  5. 【地理工具学习—MapGIS教程】常见问题处理
  6. java运行环境安装及配置教程
  7. link服务器间网络通讯错误_LINK-服务器间网络通讯错误
  8. 【数字电路基础】——逻辑门电路
  9. matlab时频分析
  10. 利用计算机指令清理垃圾,计算机Dos处理,编写一键清理系统垃圾的bat代码,小白都可以学...