首先要#include <jni.h> ,这个头文件定义了各种Java和Native交互的数据结构以及定义;在主函数里面,首先声明一个JVM的指针,然后一个JNIEnv *env的指针,JVM表示的Java虚拟实例,我通过实例消耗资源进行各种操作。 env其实对应的是一个线程,然后创建JavaVMInitArgs结构体,结构体里面要填充Java参数,用JavaVMOption表示。因为这里不需要参数,场景比较简单,所以用options[0],把 options传入 vm_args.options结构体,最后调用JNI_CreateJavaVM创建 Java虚拟器,如果返回的是“JNI_OK”,说明这次调用成功。 有了JNI指针表示实例以后,就可以用标准方法使用JNI,在这里调用一个Java方法,比如Java数据结构,先通过EMC的FindClass,找到SelectorProvider类,中间有个printf变量叫lock,先通过 GetStaticField获取 field,再通过GetStaticObjectField从 cls对象上获取fid,就是 lock对象,然后把它打印出来,最后jvm->DestroyJavaVM。详情操作如下图所示:
还有一个比较经典的例子Java Launcher, java –jar spring-application执行程序的时候,在后台默默的创建了一个jvm,把Java参数作为 arguments传进去,调用Java入口方法,通过JNI实现。
平时所说,开发jvm其实就是开发jvm的动态库, “libjvm.so”基本上本身是作为“os”提供出去,好处是非常灵活,可以作为独立应用使用,也可以在别的像cer这样的语言调用,使Java调用Native,Native调用Java更加灵活。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。