java - 使用来自 JNI 的 jvm.h

标签 java c++ jvm java-native-interface

目前我在我的 JNI 应用程序中使用 JAVA_HOME/include 中的库。这包括

  • classfile_constants.h
  • jawt.h
  • jdwpTransport.h
  • jni.h
  • jvmti.h
  • jvmticmlr.h
  • windows/jawt_md.h
  • windows/jni_md.h
  • windows/bridge/AccessBridgeCallbacks.h
  • windows/bridge/AccessBridgeCalls.c
  • windows/bridge/AccessBridgeCalls.h
  • windows/bridge/AccessBridgePackages.h

  • 虽然这些为我提供了很多控制权,但我真的希望能够调用热点源代码中定义的实际 C++ 函数。我查看了JDK 8源代码,发现src/share/javavm/export包含更多的头文件,例如具有更强大功能的 jvm.h。

    我尝试将这些包含在我的项目中,但我得到了 unresolved external symbol错误,可能是因为这些头文件不包含实际的函数定义。

    如何在我的 JNI 代码库中使用这些函数?甚至可能吗?

    先感谢您!

    最佳答案

    jvm.h 中声明的函数仅供内部 JDK 使用。它们不应该从用户代码中调用。它们不是任何公共(public) API 的一部分,它们可以在任何(甚至是次要的)JDK 更新中更改。

    可以通过将二进制文件与 libjvm 链接或使用动态查找来调用这些函数,即 dlopen / dlsym ,但是非常不鼓励使用未记录的 API,这会使您的 JNI 代码无法在不同的 JDK 版本和/或构建之间移植。

    关于java - 使用来自 JNI 的 jvm.h,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61633234/

    相关文章:

    java - Cordova, "cordova run android"之后发布

    java - Spring Data JPA规范,如何在唯一的sql请求中获取@JoinColumn数据

    java - 监控已部署的java应用程序的使用情况

    c++ - 如何删除在函数中创建的指针并作为返回值

    c++ - 将大文件读入字符数组的正确方法

    Clojure:为什么我不能在不调用它们的情况下引用类方法?

    Java:new、inheritance和objects number

    java - 需要我的 GUI 从 JTextField 读取并在 JPanel 中显示

    c++ - 有什么方法可以确定 Windows 中可移动驱动器的速度?

    java - MethodHandle - 这是什么?