gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 05:56:41 25 4
gpt4 key购买 nike

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

谢谢

最佳答案

Maybe it could be that's making a call to some alread compiled library?
是的 - 我认为您需要了解 JNI 是什么的背景知识。让我试着快速提供这个背景,因为我认为它会消除你的困惑,或者至少让你走上正轨。

Java 运行时不能在 Java 上运行 - 它们被实现为 native 可执行文件。

JNI(Java 本地接口(interface))本质上是一个用于要求 Java 运行时执行各种操作的本地接口(interface)。

在许多其他事情中,您可以使用 JNI 调用在 Java 中实现的方法 .

JNI 有许多不同的辅助方法来调用不同类型的方法。

您所询问的方法,特别是 CallStaticVoidMethod将用于调用 Java 函数,例如本例中的函数:public static void DoSomething() { ... }
为了让运行时调用该方法,它需要知道一些事情——例如:关于当前运行时/上下文/环境的信息(这是 JNIEnv * env 参数),声明静态方法的类(这个是 jclass cls 参数),要调用的方法(这是 jmethodID methodID 参数)。

编辑:

跟进您的回复:

我在 OpenJDK 代码中发现它没有太多麻烦。

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

cvmi/cvmi/jdk 通用虚拟机接口(interface)

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但我敢肯定,如果您费尽心思下载各种组件的所有源代码,您会找到一个带有该成员的结构和/或对该函数指针的分配——您可以从那里开始。

因为它应该是多个运行时的标准/通用接口(interface),所以如果在实际实现和通过 JNI 公开的方式之间存在某种间接层,我不会感到惊讶。

关于java - 试图理解 JNI.h 中的 C 函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9434581/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com