【0】README

1) 本文文字描述+source code 均转自 core java volume 2 , 旨在理解 本地方法(JNI)——使用调用API 的基础知识 ;
2) for source code, please visit : https://github.com/pacosonTang/core-java-volume/tree/master/coreJavaAdvanced/chapter12/chapter12_9


【1】本地方法(JNI)——使用调用API

(干货——能够把java 虚拟机嵌入到C 或 C++ 程序中)
1)problem+solution:

  • 1.1)problem:你有一个C 或 C++程序, 并且想要调用一些java 代码;
  • 1.2)solution:调用API(Invocation API) 使你能够把 java 虚拟机嵌入到 C 或者 C++ 程序中。

2)下面是你 初始化虚拟机的代码: (干货——初始化虚拟机的代码, 有点新鲜)

JavaVMOption options[1];
JavaVMInnitArgs vm_args;
JavaVM *jvm; //干货——虚拟机指针jvm
JNIEnv *env;options[0].optionString = "-Djava.class.path=.";memset(&vm_args, 0, sizeof(vm_args));
vm_args_version=JNI_VERSION_1_2;
vm_args.nOptions = 1;
vm_args.optoins = options;JNI_CreateJavaVM(&jvm, (void **)&env, &vm_args); //初始化虚拟机

对以上代码的分析(Analysis):

  • A1) 对 JNI_CreateJavaVM 的调用将创建虚拟机, 并且使指针jvm 指向虚拟机, 使指针env 指向执行环境; (干货——创建java虚拟机)
  • A2) 可以给虚拟机提供任意数目的选项, 这只需要增加选项数组的大小和 vm_args.nOptions 的值;
  • A3)看个荔枝: options[1].optionString = “-Djava.compiler=NONE”; // 这可以钝化即时编译器; (干货——钝化即时编译器)

    • Warning) 当你陷入麻烦导致程序崩溃, 从而不能初始化 JVM 或者不能装载你的类时, 请打开 JNI 调试模式。 设置一个选项如下: (干货——虚拟机打开 JNI 调试模式)

      options[i].optionString=”-verbose:jni”; // 你将会看到一系列说明JVM 初始化进程的消息;

3)只有在调用 Invocation API 中的其他函数时, 才需要 jvm 指针。 目前,只有四个这样的函数,最重要的一个是 终止虚拟机的函数:

(*jvm)->DestoryJavaVM(jvm);

4)看个荔枝: 下面的C程序设置了 虚拟机, 然后调用了 Welcome 类的 main 方法。 (仅供了解啦, 我也不懂他的源代码,呵呵。)

/**@version 1.20 2007-10-26@author Cay Horstmann
*/#include <jni.h>
#include <stdlib.h>#ifdef _WINDOWS#include <windows.h>
static HINSTANCE loadJVMLibrary(void);
typedef jint (JNICALL *CreateJavaVM_t)(JavaVM **, void **, JavaVMInitArgs *);#endifint main()
{  JavaVMOption options[2];JavaVMInitArgs vm_args;JavaVM *jvm;JNIEnv *env;long status;jclass class_Welcome;jclass class_String;jobjectArray args;jmethodID id_main;#ifdef _WINDOWSHINSTANCE hjvmlib;CreateJavaVM_t createJavaVM;
#endifoptions[0].optionString = "-Djava.class.path=.";memset(&vm_args, 0, sizeof(vm_args));vm_args.version = JNI_VERSION_1_2;vm_args.nOptions = 1;vm_args.options = options;#ifdef _WINDOWS   hjvmlib = loadJVMLibrary();createJavaVM = (CreateJavaVM_t) GetProcAddress(hjvmlib, "JNI_CreateJavaVM");status = (*createJavaVM)(&jvm, (void **) &env, &vm_args);
#elsestatus = JNI_CreateJavaVM(&jvm, (void **) &env, &vm_args);
#endifif (status == JNI_ERR){  fprintf(stderr, "Error creating VM\n");return 1;}class_Welcome = (*env)->FindClass(env, "Welcome");id_main = (*env)->GetStaticMethodID(env, class_Welcome, "main", "([Ljava/lang/String;)V");class_String = (*env)->FindClass(env, "java/lang/String");args = (*env)->NewObjectArray(env, 0, class_String, NULL);(*env)->CallStaticVoidMethod(env, class_Welcome, id_main, args);(*jvm)->DestroyJavaVM(jvm);return 0;
}#ifdef _WINDOWSstatic int GetStringFromRegistry(HKEY key, const char *name, char *buf, jint bufsize)
{DWORD type, size;return RegQueryValueEx(key, name, 0, &type, 0, &size) == 0&& type == REG_SZ&& size < (unsigned int) bufsize&& RegQueryValueEx(key, name, 0, 0, buf, &size) == 0;
}static void GetPublicJREHome(char *buf, jint bufsize)
{HKEY key, subkey;char version[MAX_PATH];/* Find the current version of the JRE */char *JRE_KEY = "Software\\JavaSoft\\Java Runtime Environment";if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, JRE_KEY, 0, KEY_READ, &key) != 0) {fprintf(stderr, "Error opening registry key '%s'\n", JRE_KEY);exit(1);}if (!GetStringFromRegistry(key, "CurrentVersion", version, sizeof(version))) {fprintf(stderr, "Failed reading value of registry key:\n\t%s\\CurrentVersion\n", JRE_KEY);RegCloseKey(key);exit(1);}/* Find directory where the current version is installed. */if (RegOpenKeyEx(key, version, 0, KEY_READ, &subkey) != 0) {fprintf(stderr, "Error opening registry key '%s\\%s'\n", JRE_KEY, version);RegCloseKey(key);exit(1);}if (!GetStringFromRegistry(subkey, "JavaHome", buf, bufsize)) {fprintf(stderr, "Failed reading value of registry key:\n\t%s\\%s\\JavaHome\n", JRE_KEY, version);RegCloseKey(key);RegCloseKey(subkey);exit(1);}RegCloseKey(key);RegCloseKey(subkey);
}static HINSTANCE loadJVMLibrary(void)
{HINSTANCE h1, h2;char msvcdll[MAX_PATH];char javadll[MAX_PATH];GetPublicJREHome(msvcdll, MAX_PATH);   strcpy(javadll, msvcdll);strncat(msvcdll, "\\bin\\msvcr71.dll", MAX_PATH - strlen(msvcdll));msvcdll[MAX_PATH - 1] = '\0';strncat(javadll, "\\bin\\client\\jvm.dll", MAX_PATH - strlen(javadll));javadll[MAX_PATH - 1] = '\0';h1 = LoadLibrary(msvcdll);if (h1 == NULL){fprintf(stderr, "Can't load library msvcr71.dll\n");exit(1);}h2 = LoadLibrary(javadll);if (h2 == NULL){fprintf(stderr, "Can't load library jvm.dll\n");exit(1);}return h2;
}#endif

本地方法(JNI)——使用调用API相关推荐

  1. 本地方法(JNI)——调用 java 方法

    [0]README 1) 本文部分文字描述 转自 core java volume 2 , 旨在理解 本地方法(JNI)--调用 java 方法 的基础知识 : 2) C语言调用java 方法,包括: ...

  2. native关键字(本地方法)、 java调用so动态链接库

    Java native关键字 一. 什么是Native Method    简单地讲,一个Native Method就是一个java调用非java代码的接口.一个Native Method是这样一个j ...

  3. JVM学习笔记之-运行时数据区概述及线程概述,程序计数器(PC寄存器),虚拟机栈(栈,局部变量表,操作数栈,动态连接,方法调用,方法返回地址等),本地方法接口,本地方法栈

    运行时数据区概述及线程概述 内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行.JVM内存布局规定了Java在运行过程中内存申请.分配.管理的策略,保证了JV ...

  4. 本地方法(JNI)——访问域+字符串参数

    [0]README 1) 本文部分文字描述 转自 core java volume 2 , 旨在理解 本地方法(JNI)--访问域+字符串参数 的基础知识 : 2) for source code, ...

  5. http方法_像本地方法一样调用http服务,feign框架springboot项目实践

    原创不易,请多多支持!对Java技术感兴趣的童鞋请关注我,后续技术分享更精彩. 概述 微服务在如今后台系统建设上大行其道,各子服务间接口交互方式,http请求协议又是首选.而相比远程方法调用的rmi接 ...

  6. JVM学习笔记上(概述-本地方法栈)

    背景 前一阵跟着宋红康的视频学了学JVM,视频没有更新完,所以也没学完,这里记录一下笔记 JVM概述 JVM位置:  运行在操作系统之上 相对于java语言,JVM的位置如下所示 对于安卓的Davli ...

  7. 本地方法接口和本地方法栈

    本地方法接口 什么是本地方法? 一个Native Method就是一个Java调用非Java代码的接口.一个Native Method是这样一个Java方法:该方法的实现由非Java语言实现,比如C. ...

  8. JVM---本地方法接口和本地方法栈

    本地方法接口 什么是本地方法? 简单地讲,一个 Native Method 是一个 Java 调用非 Java 代码的接囗.一个 Native Method 是这样一个 Java 方法:该方法的实现由 ...

  9. 什么是java本地方法?什么,还没听说过java的native关键字?真的该学学了!

    目录 开局一张图 什么是本地方法? 举例 为什么要使用Native Method 现状 本地方法栈 开局一张图 什么是本地方法? 简单地讲,一个Native Method就是一个Java调用非Java ...

  10. JNI----Native本地方法接口

    Native本地方法接口 JNI:Java Native Interface 本地接口的作用是融合不同的编程语言为Java所用,它的初衷是融合C/C++程序 native:凡是带native关键字的, ...

最新文章

  1. 15℃!人类首次实现高压下室温超导,研究登上Nature封面
  2. ffmpeg 移植到 android 并使用
  3. android开发过程中项目中遇到的坑----布点问题
  4. char* 和jstring转换
  5. python hex 补0_Python保留前导零的二进制到十六进制转换
  6. [YTU]_2621(B 继承 圆到圆柱体)
  7. 对Javascript 类、原型链、继承的理解
  8. springMVC3.0(文件上传,@RequestMapping加参数,@SessionAttributes,@ModelAttribute,转发,重定向,数值获取,传参,ajax,拦截器)
  9. 全国计算机等级考试题库二级C操作题100套(第80套)
  10. iOS - Swift Foundation 框架
  11. 织梦服务器怎么修改,织梦dedecms更换服务器搬家教程
  12. 吴恩达机器学习学习笔记第六章:机器学习中的线性代数操作python3版(含numpy、panda库的使用)
  13. awstats日志分析小结
  14. ExecutorService的四种线程池
  15. 苹果妙控鼠标二代(Magic Mouse 2 )如何连接到 Window 10系统
  16. Facebook安卓Feed流的内存优化实践
  17. elasticsearch报错org.elasticsearch.discovery.MasterNotDiscoveredException: null
  18. 数智时代,英特尔的“三个火枪手”
  19. Linux服务器开通443端口
  20. 解决老Mac强行双系统后Mac系统引导丢失出现no bootable device

热门文章

  1. 几个冷门字符串算法的学习笔记(最小表示法,exKMP,Lyndon Word)
  2. 【每日一题】1月29日题目 和与或
  3. 内存管理(ybtoj-二叉堆)
  4. 动态规划:openjudge 2.6-3532 最大上升子序列和 解题心得
  5. YbtOJ#652-集合比较【Treap】
  6. P4317-花神的数论题【组合数学】
  7. jzoj3360-[NOI2013模拟]苹果树【树上莫队,LCA】
  8. P5004-专心OI - 跳房子【dp,矩阵乘法】
  9. P1282-多米诺骨牌【dp,背包】
  10. 【暴力】MSWORLD