GCC中的外部"Java"块

Iha*_*har 21 c++ java java-native-interface gcc gcj

我在C++的GCC文档中发现了一个有趣的特性:

java_interface

此类型属性通知C++该类是Java接口.它可能只适用于在extern"Java"块中声明的类.将使用GCJ的接口表机制调度对此接口中声明的方法的调用,而不是常规的虚拟表调度.

据我所知,它看起来像这样:

extern "Java" {
    class NativeClass __attribute__((java_interface)) {
        //Implementation on native methods goes here.
    }
}
Run Code Online (Sandbox Code Playgroud)

有人知道这方面的细节吗?如何从Java 调用NativeClass的方法?也许有人在现场试过吗?

MvG*_*MvG 5

GCJ 为Java 提供了两个本机接口:使用C语言的JNI和使用C++的CNI.由于您引用的示例使用类,因此必须引用后者.接口上CNI文档仅描述了如何从C++代码访问Java中描述的接口.您的示例似乎是反过来的:用C++编写的类,可以从Java访问并充当Java接口.

但是关于这方面的细节很少,因此试验和错误将是尝试这一点的一种方式,并且查看实际的GCC来源将是另一种.如果您想查看extern "Java"块和java_interface属性的一个示例,请查看java/lang/Readable.h.它包含Java接口的C++表示java.lang.Readable.作为该文件的第一行,它是机器生成的.所以可能之所以文档这么少,是因为你不应该自己写这些东西.这只是GCJ如何实现CNI的细节.并且仔细查看上面的文件,它们甚至违反了他们自己的文档,因为它Readable.h具有extern块外的属性,与您引用的代码段相反.