如何使用 JNI 从已运行的 JVM 获取 JavaVM 或 JNIEnv?

maj*_*opa 5 java-native-interface ffi dll-injection rust jnienv

我正在做一个涉及 Rust 和 Java 的项目。我需要能够从 Rust 端使用 JNI,而无需 Java 端调用它(因为它不是我的代码)。到目前为止,我已经能够确保我的 DLL 被注入(在按键上打开一个小窗口,我一直在使用它进行调试)。

相关代码的简短示例如下:

use jni::sys::{JNI_GetCreatedJavaVMs, JNIInvokeInterface_};


let jvm_ptr = null_mut() as *mut *mut *const JNIInvokeInterface_;
let count = null_mut();

// hasn't crashed

JNI_GetCreatedJavaVMs(jvm_ptr, 1, count);  // https://docs.rs/jni/latest/jni/sys/fn.JNI_GetCreatedJavaVMs.html

// crashes
Run Code Online (Sandbox Code Playgroud)

我的问题是:在这种情况下是否有可能/如何获得 JNI 环境?

maj*_*opa 1

在评论的帮助下,我让崩溃不再发生。诀窍是预先分配一个数组。

let jvm_ptr = Vec::with_capacity(1).as_mut_ptr();
let count = null_mut();

JNI_GetCreatedJavaVMs(jvm_ptr, 1, count);
Run Code Online (Sandbox Code Playgroud)