Java “外部”;爪哇语;GCC中的块

Java “外部”;爪哇语;GCC中的块,java,c++,gcc,java-native-interface,gcj,Java,C++,Gcc,Java Native Interface,Gcj,我在C++的GCC文档中发现了一个有趣的问题: java_接口 此类型属性通知C++类是java接口。它只能应用于外部“Java”块中声明的类。对此接口中声明的方法的调用将使用GCJ的接口表机制进行调度,而不是常规的虚拟表调度 据我所知,它看起来像这样: extern "Java" { class NativeClass __attribute__((java_interface)) { //Implementation on native methods goes he

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

java_接口

此类型属性通知C++类是java接口。它只能应用于外部“Java”块中声明的类。对此接口中声明的方法的调用将使用GCJ的接口表机制进行调度,而不是常规的虚拟表调度

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

extern "Java" {
    class NativeClass __attribute__((java_interface)) {
        //Implementation on native methods goes here.
    }
}

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

我第一次遇到这种块类型时,它不是用于“java”,而是用于“C”,所以我想这也是我的兴趣所在。块定义为:

extern "Java"
{
// some java definition
}
用于向GCC指定此块是java接口。它用于描述用于定义类的损坏类型。gcc使用名称mangling通过参数等生成函数名。。。更多信息请点击此处: 因此,在导入Java代码时,可以使用
外部“Java”
调用它,就像调用C/C++中的任何函数一样,无需指定损坏的名称,。我只使用了一个带有C函数的DLL,它被加载在C++代码中,所以我使用一个EXTEN“C”来指定GCC,这个函数的定义不使用名称的修改。 那么,现在如何在java中调用本机方法,因为java中的所有都是方法,所有都是对象,没有函数。首先,您必须用java描述您的类,您想用本机语言执行的所有函数都必须定义为本机:
private native void print()例如。其次,在本机代码头中,必须按照术语定义方法:

extern "Java"
{
        JNIEXPORT YourReturnType JNICALL Java_ClassName_MethodName (JNIEnv* env, jobject obj);
}
至少,所有方法都必须是这样,因为JNI将发送一个JNIEnv指针和一个对象,该对象在方法中是“this”,如果您有其他参数,则必须在2个基本参数之后给出。最后,您只需在本机代码文件中实现所有方法,始终遵循规范,如:

 JNIEXPORT void JNICALL Jave_Printer_print(JNIEnv* env, jobject obj)
 {
      printf("Hello world");
 }
现在您可以在Java中创建一个Printer对象,并调用定义为native的print方法。 我希望我回答了你的问题。

< P> GCJ为java提供了两个本地接口:使用C++和使用C++。由于您引用的示例使用了类,因此它必须引用后者。仅描述如何从C++代码访问爪哇中描述的接口。你的例子看起来是另一种方式:用C++编写的类,它可以从java访问,并用作java接口。
但是关于这方面的细节很少,所以反复试验将是一种试验方法,而查看实际的GCC来源将是另一种方法。如果您想查看
extern“Java”
块和
Java\u接口
属性的一个示例,请查看。它包含java接口的C++表示。正如该文件的第一行所述,它是机器生成的。所以,文档这么少的原因可能是因为你不应该自己写这些东西。这只是GCJ如何实现CNI的一个细节。更仔细地看上面的文件,似乎它们甚至违反了自己的文档,因为
Readable.h
具有
extern
块之外的属性,这与您引用的代码片段不同。

您考虑过吗?GCJ--GNU编译器for Java。所以,它可能只对GCJ编译的字节码有效。无论如何,如果它在没有JNI的情况下工作,这是很有趣的。它只在GCJ下工作。基本上没有人使用GCJ,所以这并不重要。我知道外部“C”调用约定。但是Java是不同的。它至少需要JNI来调用本机函数(而不是方法!)。我不知道如何从java调用这个块中的代码抱歉,我不明白您想要这样做,所以我编辑了,添加了一些提示来调用java中的方法,但我认为java中没有函数,我坚信这根本不是关于JNI,而是关于CNI。有关详细信息,请参阅我的答案。在这种情况下,你的大部分答案都指向了错误的方向。Thanx,MvG。你已经澄清了一切