【问题标题】:Trying to understand C function call in JNI.h试图理解 JNI.h 中的 C 函数调用
【发布时间】:2012-03-15 03:06:11
【问题描述】:

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

谢谢

【问题讨论】:

    标签: java c openjdk


    【解决方案1】:

    Maybe it could be that's making a call to some alread compiled library?

    是的 - 我认为您需要了解 JNI 是什么的背景知识。让我尝试快速提供该背景,因为我认为它会消除您的困惑,或者至少让您走上正轨。

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

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

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

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

    您所询问的方法,特别是 CallStaticVoidMethod 将用于调用 Java 函数,例如本示例中的函数: public static void DoSomething() { ... }

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

    编辑:

    跟进您的回复:

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

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

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

    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 但我敢肯定,如果您下载各种组件的所有源代码的麻烦,您会发现该成员的结构和/或分配到那个函数指针 - 你可以从那里开始。

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

    【讨论】:

    • Steve,我已经很清楚你提到的有关 JNI 的事实。事实上,这正是我试图接触该函数主体的动机。我的问题是……它的来源在哪里?
    • @Devouredelysium - 啊,好吧,对不起。好吧,您提供的链接不是指向 java 运行时/vm 的链接 - 因此实现不会在该项目中。如果你问 OpenJDK 的实现在哪里——我知道这个想法——但我的好朋友 grep 可能会。
    • 哦,对不起。我已经看到了你现在展示的功能。但我有这样的想法,即最后一个函数调用了 OP 中显示的另一个函数。如果我错了,那么我想知道函数在哪里->CallStaticVoidMethodV(this,cls,methodID,args)。
    • @devouredelysium - “函数”是一个变量——某种类型的变量,它有一个指向名为“CallStaticVoidMethodV”的函数的指针——它被分配在某处。您需要找到它的分配位置。我在编辑中添加了更多内容,以描述为什么我敢打赌它可能与您正在寻找的实际实现相去甚远。
    • 如果我没记错的话,"functions" 是在该文件中分配的。在同一个结构中,您会发现 OP 中显示的函数。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-31
      • 2020-10-19
      • 2015-03-23
      相关资源
      最近更新 更多