试图理解JNI.h中的C函数调用

时间:2012-02-24 16:41:06

标签: java c openjdk

我正在深入研究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

由于

2 个答案:

答案 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代码中发现它并没有太多麻烦。

http://hg.openjdk.java.net/

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声明为指向函数的指针,该函数不返回任何内容,并且接受三个或更多参数。