NDK(13)JNIEnv和JavaVM】的更多相关文章

转自:  http://www.cnblogs.com/canphp/archive/2012/11/13/2768937.html JNIEnv是一个与线程相关的变量,不同线程的JNIEnv彼此独立.JavaVM是虚拟机在JNI层的代表,在一个虚拟机进程中只有一个JavaVM,因此该进程的所有线程都可以使用这个JavaVM.当后台线程需要调用JNI native时,在native库中使用全局变量保存JavaVM尤为重要,这样使得后台线程能通过JavaVM获得JNIEnv.(这句话引用了<深入理…
 JNI的实现可涉及两个关键类:JNIEnv和JavaVM. JavaVM:这个代表java的虚拟机.所有的工作都是从获取虚拟机的接口开始的.             第一种方式,在加载动态链接库的时候,JVM会调用JNI_OnLoad(JavaVM* jvm, void* reserved)(如果定义了该函数).第一个参数会传入JavaVM指针.             第二种方式,在native code中调用JNI_CreateJavaVM(&jvm, (void**)&env, &…
下面介绍2个与JNI机制相关的类型JNIEnv和JavaVM. 1.JNIEnv JNIEnv一般是是由虚拟机传入,而且与线程相关的变量,也就说线程A不能使用线程B的JNIEnv.而作为一个结构体,它里面定义了JNI系统操作函数.在之前介绍的实例中,可以看到C的Java_TestJNI_set()或Java_TestJNI_get()函数的实现中,第1个参数的类型为JNIEnv*.JNIEnv的定义如下: 来源:openjdk/hotspot/src/share/vm/prims/jni.h s…
此文章是关于NDK线程的第二篇理论知识笔记.主要有两个点,如下: 1.pthread_create(Too many arguements, expected 1) ?2.线程中如何获取JNIEnv?GetEnv返回NULL?3.FindClass返回NULL ?首先我们在主页MainActivity的代码如下: public class MainActivity extends Activity { static { try { System.loadLibrary("native-lib&q…
JavaVM和JNIEnv的初始化和JVM各模块的初始化都是在JNI_CreateJavaVM()函数中完成.这一篇将详细介绍JavaVM和JNIEnv的初始化过程. 1.初始化JavaVM JavaVM的初始化都是在JNI_CreateJavaVM()函数中完成,调用链如下: JavaMain() java.c InitializeJVM() java.c JNI_CreateJavaVM() jni.cpp 在JavaMain()函数中调用InitializeJVM()函数,Initiali…
JNI Tips In this document JavaVM and JNIEnv Threads jclass, jmethodID, and jfieldID Local and Global References UTF-8 and UTF-16 Strings Primitive Arrays Region Calls Exceptions Extended Checking Native Libraries 64-bit Considerations Unsupported Fea…
1.关于JNIEnv和JavaVM JNIEnv是一个与线程相关的变量,不同线程的JNIEnv彼此独立.JavaVM是虚拟机在JNI层的代表,在一个虚拟机进程中只有一个JavaVM,因此该进程的所有线程都可以使用这个JavaVM.当后台线程需要调用JNI native时,在native库中使用全局变量保存JavaVM尤为重要,这样使得后台线程能通过JavaVM获得JNIEnv. native程序中频繁使用JNIEnv*和JavaVM*.而C和C++代码使用JNIEnv*和JavaVM*这两个指针…
jni.h文件 : 了解 JNI 需要配合 jni.h 文件, jni.h 是 Google NDK 中的一个文件, 位置是 $/Android-ndk-r9d/platforms/android-19/arch-arm/usr/include/jni.h ; 1. JNIEnv 作用 JNIEnv 概念 : 是一个线程相关的结构体, 该结构体代表了 Java 在本线程的运行环境 ; JNIEnv 与 JavaVM : 注意区分这两个概念; -- JavaVM : JavaVM 是 Java虚拟…
友情提示:欢迎关注本人公众号,那里有更好的阅读体验以及第一时间获取最新文章 本篇目录 以下举例代码均来自:NDK示例代码 一.前言 安卓开发中很多场景需要用到NDK来开发,比如,音视频的渲染,图像的底层绘制,秘籍计算应用,复用C/C++库等等,安卓绝大部分核心代码都是在Native层来完成,也就是用C/C++来完成,有的时候我们看系统源码的时候追着追着就发现最终调用一个native声明的方法,接下来就需要深入native层来查看具体逻辑了,那java代码是怎么调用native层代码的呢?或者说j…
继续研究NDK 我在阿里云服务器上搭建了Android ndk的开发平台,并且借助这一平台研究了NDK的内部细节. NDK提供了Android本地编程的接口,让你可以开发高效的依赖库,提高程序的速度,像是图像处理类和游戏类必然是少不了这个东西的,此外对于嵌入式开发者来说,有的时候需要绕过虚拟机直接跟内核通信那么就需要这个东西了.之前看到学长做的项目说,需要在Android上做一个音乐接口,但是翻遍了Android的api发现都实现不了,这个时候其实用ndk去调用底层的库,就可以跟内核的数据流建立…