如何定义泛型类的JNI方法签名?

时间:2013-09-05 23:34:33

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

我有一个在java中定义的基类。我想称之为原生方法:

public class Base<T>
{
    public void doSomething()
    {
        nativeDoSomething();
    }

    private native void nativeDoSomething();
}

我的问题是,如何指定泛型类的jni方法签名?

3 个答案:

答案 0 :(得分:4)

我已经迟到了,但我会将其添加到将来的参考资料中。

Java中的泛型是使用Type Erasure实现的,基本上是:泛型仅存在于编译时中:它们在此之后消失,不存在于运行时< / em>的

这意味着,即使您可以使用public native void blah(E genericOne, F genericTwo)之类的方法,但在编译时,它实际上已转换为public native void blah(Object genericOne, Object genericTwo)

这样,在使用Java Native Interface时,您甚至不需要关心泛型:所有内容都转换为Object,因此您只需将它们引用为jobject

Java类也是如此:您可以简单地将它们引用为jclass

答案 1 :(得分:3)

javah似乎忽略了泛型:

JNIEXPORT void JNICALL Java_Base_nativeDoSomething
   (JNIEnv *, jobject);

答案 2 :(得分:0)

javah。当有一个为你做的工具时,不要试图弄清楚它。