我正在深入研究Java的OpenJDK源代码,我希望能够学习CallStaticVoidMethod
。但我很难做到这一点。
这是我被踩的地方:
00535 void (JNICALL *CallStaticVoidMethod)
00536 (JNIEnv *env, jclass cls, jmethodID methodID, ...);
如果我粗略的C知识是正确的,这看起来像一个函数调用(到哪里?)。也许它可能会调用一些已读的编译库?
(JNICALL只是一个召唤大会) 因为JNICALL似乎是__stdcall(What is __stdcall?)
这是文件的完整源代码: http://xdprof.sourceforge.net/doxygen/jni_8h-source.html
由于
答案 0 :(得分:2)
Maybe it could be that's making a call to some alread compiled library?
是的 - 我认为你需要一些关于JNI的背景知识。让我尝试快速提供这种背景,因为我认为它可以消除你的困惑,或者至少让你走上正确的轨道。
Java运行时无法在Java上运行 - 它们是作为本机可执行文件实现的。
JNI(Java Native Interface)本质上是一个本机接口,用于要求Java运行时执行各种操作。
在众多其他事项中,您可以使用JNI来调用Java中实现的方法。
JNI有许多不同的辅助方法来调用不同类型的方法。
您要询问的方法,特别是CallStaticVoidMethod
将用于调用Java函数,例如本例中的函数:
public static void DoSomething() { ... }
为了让运行时调用该方法,它需要知道一些事情 - 例如:有关当前运行时/上下文/环境的信息(这是JNIEnv * env
参数),类是静态方法声明在(这是jclass cls
参数),要调用的方法(这是jmethodID methodID
参数)。
修改强>
跟进你的回复:
我在OpenJDK代码中发现它并没有太多麻烦。
cvmi / cvmi / jdk通用VM接口
http://hg.openjdk.java.net/cvmi/cvmi/jdk/archive/tip.zip
在:
./ SRC /共享/ JavaVM的/导出/ 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公开的方式之间存在某种间接层,我不会感到惊讶。
答案 1 :(得分:1)
这将CallStaticVoidMethod
声明为指向函数的指针,该函数不返回任何内容,并且接受三个或更多参数。