Java 试图理解JNI.h中的C函数调用
我正在深入研究Java的OpenJDK源代码,我希望学习一下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只是一种调
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中显示的函数。