将Java本机方法映射到C ++成员函数

时间:2010-03-09 14:37:22

标签: java c++ java-native-interface

JNI的示例我已经看到了通过C ++全局函数实现Java本机方法的映射。有没有办法将本机方法实现设置为C ++对象的成员函数?

5 个答案:

答案 0 :(得分:3)

JNI对您的C ++类一无所知。它只允许您使用本机代码实现Java类的方法。 您编写的C ++函数是Java类的方法,因此同时使它们成为不同C ++类的方法没有意义。

如果您担心命名空间污染,可以使用RegisterNatives手动设置本机方法的链接。这样做可以让您按照自己的方式命名函数,将本机函数放入命名空间,或者将它们声明为静态以防止导出符号。我想你可以使用这种方法链接到C ++类的静态方法,但我严重怀疑它会让你的代码更容易理解,特别是如果在Java方面,这个方法是非静态的。

答案 1 :(得分:1)

简单回答:不。 JVM的已定义行为是调用全局函数。

为自己做这件事并不是特别困难。一种方法是让第一个JNI函数返回一个long'句柄',实际上是一个指向对象的指针。让其他函数在将其转换回指针后调用方法。

答案 2 :(得分:0)

我认为这不会立即起作用,因为JNI无法知道方法调用属于哪个C ++对象(实例)。您必须手动映射到正确的对象。

答案 3 :(得分:0)

它确实适用于方法。但是你不想在这里处理来自C ++的异常。

答案 4 :(得分:0)

不单独使用JNI。

但是,您可以使用诸如BridJ之类的库,它支持将本机Java方法绑定到C ++方法(您的Java类必须与C ++类具有相同的名称,并从CPPObject派生,除其他外)