Maybe it could be that's making a call to some alread compiled library?
是的 - 我认为您需要了解 JNI 是什么的背景知识。让我尝试快速提供该背景,因为我认为它会消除您的困惑,或者至少让您走上正轨。
Java 运行时不能在 Java 上运行 - 它们是作为本机可执行文件实现的。
JNI(Java 本地接口)本质上是一个用于要求 Java 运行时执行各种操作的本地接口。
在许多其他事情中,您可以使用 JNI 来调用用 Java 实现的方法。
JNI 有许多不同的辅助方法来调用不同类型的方法。
您所询问的方法,特别是 CallStaticVoidMethod 将用于调用 Java 函数,例如本示例中的函数:
public static void DoSomething() { ... }
为了让运行时调用该方法,它需要知道一些事情——例如:有关当前运行时/上下文/环境的信息(这是JNIEnv * env 参数)、声明静态方法的类in(这是jclass cls 参数),要调用的方法(这是jmethodID methodID 参数)。
编辑:
跟进您的回复:
我在 OpenJDK 代码中发现它没有太多麻烦。
http://hg.openjdk.java.net/
cvmi/cvmi/jdk 通用虚拟机接口
http://hg.openjdk.java.net/cvmi/cvmi/jdk/archive/tip.zip
下:
./src/share/javavm/export/jni.h
void CallStaticVoidMethod(jclass cls, jmethodID methodID, ...) {
va_list args;
va_start(args,methodID);
functions->CallStaticVoidMethodV(this,cls,methodID,args);
va_end(args);
}
我不知道这是在哪里分配的:functions->CallStaticVoidMethodV 但我敢肯定,如果您下载各种组件的所有源代码的麻烦,您会发现该成员的结构和/或分配到那个函数指针 - 你可以从那里开始。
因为它应该是多个运行时的标准/通用接口,如果在实际实现和通过 JNI 公开的方式之间存在某种间接层,我不会感到惊讶。