Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 试图理解JNI.h中的C函数调用_Java_C_Openjdk - Fatal编程技术网

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

Java 试图理解JNI.h中的C函数调用,java,c,openjdk,Java,C,Openjdk,我正在深入研究Java的OpenJDK源代码,我希望学习一下CallStaticVoidMethod。但我很难做到这一点 这就是我被踩踏的地方: 00535 void (JNICALL *CallStaticVoidMethod) 00536 (JNIEnv *env, jclass cls, jmethodID methodID, ...); 如果我粗略的C知识是正确的,这看起来像是一个函数调用(到哪里?)。可能是打电话给某个alread编译库 (JNICALL只是一种调

我正在深入研究Java的OpenJDK源代码,我希望学习一下
CallStaticVoidMethod
。但我很难做到这一点

这就是我被踩踏的地方:

00535     void (JNICALL *CallStaticVoidMethod)
00536       (JNIEnv *env, jclass cls, jmethodID methodID, ...);
如果我粗略的C知识是正确的,这看起来像是一个函数调用(到哪里?)。可能是打电话给某个alread编译库

(JNICALL只是一种调用约定) 因为JNICALL似乎是uu stdcall()

以下是该文件的完整源代码:


感谢

这将
CallStaticVoidMethod
声明为指向一个函数的指针,该函数不返回任何内容,并接受三个或更多参数。

可能是调用了某个alread编译库?

是的,我想你需要一些关于JNI的背景知识。让我试着快速提供背景资料,因为我认为这将消除你的困惑,或者至少让你走上正确的道路

Java运行时不能在Java上运行——它们是作为本机可执行文件实现的

JNI(Java本机接口)本质上是一个本机接口,用于请求Java运行时执行各种操作。

在众多其他功能中,您可以使用JNI调用Java中实现的方法

JNI有一系列不同的助手方法来调用不同类型的方法

特别是,您询问的方法,
CallStaticVoidMethod
将用于调用Java函数,如本例中的函数:
publicstaticvoiddosomething(){…}

为了让运行时调用该方法,它需要知道一些事情——例如:关于当前运行时/上下文/环境的信息(这是
JNIEnv*env
参数)、静态方法声明的类(这是
jclass cls
参数)、要调用的方法(这是
jmethodID方法ID
参数)

编辑:

就你的答复采取后续行动:

我在OpenJDK代码中发现了它,没有太多问题

cvmi/cvmi/jdk通用虚拟机接口

根据:

./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公开的方式之间存在某种程度的间接关系,我不会感到惊讶。

Steve,我已经很清楚您提到的关于JNI的事实。事实上,这正是我试图得到我的答案的动机把手放在那个函数的主体上。我的问题是…它的源在哪里?@Ownedelysium-啊,好吧,对不起。你提供的链接不是指向java运行时/vm的链接-所以实现不会在那个项目中。如果你问OpenJDK东西的实现在哪里-我知道-但我的好朋友
grep
可能是是的。哦,对不起。我已经看到了您现在显示的函数。但是我认为是最后一个函数调用了OP中显示的另一个函数。如果我错了,那么我想知道functions->CallStaticVoidMethodV(this,cls,methodID,args)在哪里。@Ownedelysium-“functions”是一个变量-某种类型的变量,它有一个指向函数“CallStaticVoidMethodV”的指针-该函数被分配到某个位置。您需要找到它被分配的位置。我在编辑中添加了更多内容,以说明为什么我打赌它可能与您正在寻找的实际实现相差一个级别。“函数”如果我没弄错的话,在该文件中被赋值。在同一个结构中,您将找到OP中显示的函数。