开发者社区> 问答> 正文

从native怎么调用Java?

从native怎么调用Java?

展开
收起
1358896759097293 2021-05-04 15:28:06 855 0
1 条回答
写回答
取消 提交回答
  • 45271990@qq.com

    首先要#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。详情操作如下图所示: 22.png

    还有一个比较经典的例子Java Launcher, java –jar spring-application执行程序的时候,在后台默默的创建了一个jvm,把Java参数作为 arguments传进去,调用Java入口方法,通过JNI实现。

    23.png

    平时所说,开发jvm其实就是开发jvm的动态库, “libjvm.so”基本上本身是作为“os”提供出去,好处是非常灵活,可以作为独立应用使用,也可以在别的像cer这样的语言调用,使Java调用Native,Native调用Java更加灵活。

    2021-05-05 22:55:50
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载