JNIEnv提供了大多数的JNI函数。你的本地方法都会接收JNIEnv作为第一个参数。
JNIEnv用于本地线程存储。因此,你不能在线程间共享同一个JNIEnv。
如果一个代码段没有其他方式获取它自身线程的JNIEnv,你可以共享JavaVM,用GetEnv来获取线程的JNIEnv。(假设这个线程有一个JavaVM;参见下面的AttachCurrentThread。)

  1. static JavaVM *myVm;
  2.  
  3. /*
  4. * This is called by the VM when the shared library is first loaded.
  5. */
  6. extern "C" jint JNI_OnLoad(JavaVM* vm, void* reserved) {
  7. myVm = vm;
  8.  
  9. jint result = -1;
  10. JNIEnv* env = NULL;
  11. LOGI("JNI_OnLoad");
  12. if (vm->GetEnv((void **)&env, JNI_VERSION_1_4) != JNI_OK) {
  13. LOGE("ERROR: GetEnv failed");
  14. goto bail;
  15. }
  16.  
  17. // initClassHelper(env, "com/example/camera/AnObject", &gCameraViewObject);
  18.  
  19. if (registerNatives(env) != JNI_TRUE) {
  20. LOGE("ERROR: registerNatives failed");
  21. goto bail;
  22. }
  23.  
  24. result = JNI_VERSION_1_4;
  25. bail:
  26. return result;
  27. }
  28.  
  29. void JNI_OnUnload(JavaVM* vm, void* reserved)
  30. {
  31. // JNIEnv* env = NULL;
  32. LOGI("JNI_OnUnload");
  33. // if (vm->GetEnv((void **)&env, JNI_VERSION_1_4) != JNI_OK) {
  34. // LOGE("ERROR: GetEnv failed");
  35. // return;
  36. // }
  37. //
  38. // if (gCameraViewObject != NULL) {
  39. // env->DeleteGlobalRef(gCameraViewObject);
  40. // gCameraViewObject = NULL;
  41. // }
  42. }
  1. JNIEnv* Android_JNI_GetEnv(void)
  2. {
  3. /* From http://developer.android.com/guide/practices/jni.html
  4. * All threads are Linux threads, scheduled by the kernel.
  5. * They're usually started from managed code (using Thread.start), but they can also be created elsewhere and then
  6. * attached to the JavaVM. For example, a thread started with pthread_create can be attached with the
  7. * JNI AttachCurrentThread or AttachCurrentThreadAsDaemon functions. Until a thread is attached, it has no JNIEnv,
  8. * and cannot make JNI calls.
  9. * Attaching a natively-created thread causes a java.lang.Thread object to be constructed and added to the "main"
  10. * ThreadGroup, making it visible to the debugger. Calling AttachCurrentThread on an already-attached thread
  11. * is a no-op.
  12. * Note: You can call this function any number of times for the same thread, there's no harm in it
  13. */
  14.  
  15. JNIEnv *env;
  16. int status = (*myVm)->AttachCurrentThread(myVm, &env, NULL);
  17. if(status < 0) {
  18. LOGE("failed to attach current thread");
  19. return 0;
  20. }
  21.  
  22. /* From http://developer.android.com/guide/practices/jni.html
  23. * Threads attached through JNI must call DetachCurrentThread before they exit. If coding this directly is awkward,
  24. * in Android 2.0 (Eclair) and higher you can use pthread_key_create to define a destructor function that will be
  25. * called before the thread exits, and call DetachCurrentThread from there. (Use that key with pthread_setspecific
  26. * to store the JNIEnv in thread-local-storage; that way it'll be passed into your destructor as the argument.)
  27. * Note: The destructor is not called unless the stored value is != NULL
  28. * Note: You can call this function any number of times for the same thread, there's no harm in it
  29. * (except for some lost CPU cycles)
  30. */
  31. pthread_setspecific(mThreadKey, (void*) env);
  32.  
  33. return env;
  34. }

JavaVM & JNIEnv的更多相关文章

  1. NDK(13)JNIEnv和JavaVM

    转自:  http://www.cnblogs.com/canphp/archive/2012/11/13/2768937.html JNIEnv是一个与线程相关的变量,不同线程的JNIEnv彼此独立 ...

  2. NDK开发之javaVM

    1.关于JNIEnv和JavaVM JNIEnv是一个与线程相关的变量,不同线程的JNIEnv彼此独立.JavaVM是虚拟机在JNI层的代表,在一个虚拟机进程中只有一个JavaVM,因此该进程的所有线 ...

  3. [转]JNIEnv解析

    1.关于JNIEnv和JavaVM JNIEnv是一个与线程相关的变量,不同线程的JNIEnv彼此独立.JavaVM是虚拟机在JNI层的代表,在一个虚拟机进程中只有一个JavaVM,因此该进程的所有线 ...

  4. 【Android 系统开发】Android JNI/NDK (三) 之 JNIEnv 解析

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

  5. Android JNI 之 JNIEnv 解析

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

  6. JNIEnv解析

    1.关于JNIEnv和JavaVM JNIEnv:线程相关的变量 JavaVM:是虚拟机在JNI层的代表, JNIEnv是一个与线程相关的变量,不同线程的JNIEnv彼此独立.JavaVM是虚拟机在J ...

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

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

  8. Android jni系统变量、函数、接口定义汇总

    在做Android jni开发时,jni为我们提供了哪些函数.接口.变量,有时候一头雾水,今天就把jni.h中定义的所有内容列出来,供自己查阅: /* * Copyright (C) 2006 The ...

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

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

随机推荐

  1. C语言黑与白问题

    问题描述: 有A.B.C.D.E这5个人,每个人额头上都帖了一张黑或白的纸.5人对坐,每 个人都可以看到其他人额头上纸的颜色.5人相互观察后: A说:“我看见有3人额头上贴的是白纸,1人额头上贴的是黑 ...

  2. [LeetCode] 140. 单词拆分 II

    题目链接 : https://leetcode-cn.com/problems/word-break-ii/ 题目描述: 给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符 ...

  3. web 过滤器 Filter、 Spring 拦截器 interceptor

    1.过滤器(Filter)(在web.xml中注册过滤器) 首先说一下Filter的使用地方,我们在配置web.xml时,总会配置下面一段设置字符编码,不然会导致乱码问题: <filter> ...

  4. Linux :环境变量设置和本地变量加载

    bash: 全局变量: /etc/profile,  /etc/profile.d/*,  /etc/bashrc 个人变量: ~/.bash_profile,   ~/.bashrc bash运行方 ...

  5. nodeJS打包安装和问题处理

    一,执行步骤,打包报错 1,查看npm版本npm -v 2,查看gulp版本(报错怎么证明没安装)gulp --version 3,安装gulpnpm install --global gulp-cl ...

  6. javascript中跨域问题的解决方法汇总

    javascript中实现跨域的方式总结 第一种方式:jsonp请求:jsonp的原理是利用<script>标签的跨域特性,可以不受限制地从其他域中加载资源,类似的标签还有<img& ...

  7. HTML-美化

    1.美化文本 1.1第一部分 font-size:字体大小,常用em.px.%.rem作单位,预设值small.large.medium,可继承, font-weight:加粗字体,属性为bold,加 ...

  8. ssm中web配置各框架的配置文件路径方式

    一.在web文件中配置 使用逗号隔开 二.在applicationContext.xml文件中配置或引用 以下是引用方式 注: <import />标签要放在所有bean配置的最前面.  

  9. IAR

    IAR是什么 支持众多半导体公司产品的c处理器 http://www.rimelink.com/pr.jsp

  10. java Collections.binarySearch 用法

    package testCollections; import java.util.ArrayList;import java.util.Collections;import java.util.Co ...