Java 泛型和 JNI

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

是否可以使用采用通用参数的 JNI 调用 native CPP 函数?类似于以下内容:

public static native <T, U, V> T foo(U u, V v);

然后这样调用它:

//class Foo, class Bar, class Baz are already defined;
Foo f = foo(new Bar(), new Baz());

任何人都可以向我提供实际执行此操作的示例或网络上执行此操作的一些教程吗?我问是因为在我的 CPP JNI 函数(由 JVM 调用)中,我收到不满意的链接错误。

CPP 代码如下:

JNIEXPORT jobject JNICALL Java_Processor_process (JNIEnv *env, jclass processor_class, jobject obj1, jobject obj2)
{
    jclass bar_class = env->FindClass("Bar");
    jmethodID getFooMethod = env->GetMethodID(bar_class, "getFoo", "()Ljava/lang/Object;");
//getFoo() is defined as `public Foo getFoo();` in Bar.java
    return env->CallObjectMethod(obj1, getFooMethod);
}

编辑:

我已经尝试修改代码,但现在我得到了 NoSuchMethodError:

Java代码:

public static native <U, V> String foo(U u, V v);
//...
String str = foo(new Bar(), new Baz());

CPP代码:

JNIEXPORT jstring JNICALL Java_Processor_process (JNIEnv *env, jclass processor_class, jobject obj1, jobject obj2)
{
    jclass bar_class = env->FindClass("Bar");
    jmethodID getFooMethod = env->GetMethodID(bar_class, "getFoo", "()Ljava/lang/String;");
    //getFoo() is now defined as `public String getFoo();` in Bar.java
    return env->CallObjectMethod(obj1, getFooMethod);
}

这是否意味着 JNI 不支持泛型或者我错过了什么?

最佳答案

一般来说,您应该始终使用 javap -s 来获取您要在 JNI 中查找的方法的签名。不要猜测。

关于Java 泛型和 JNI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2228275/

相关文章:

java - 无法在java中的jscrollPane中将组件添加到jpanel

java - 为什么 Rust 原生库在调用函数时会随机崩溃?

c++ - 需要帮助将 argv 实现到某些来源

c++ - 数据成员地址是否位于 (this) 和 (this+1) 之间?

c# - 如何在泛型类中识别匹配类型

java - 添加次数,计算总时间

java - com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException 未知列

c++ - 如何在库中强制包含 "unused"对象定义

c# - 避免使用 if-else 或 switch-case 语句来进行决定

c# - 如何实现一个类的泛型和非泛型版本?