【发布时间】:2010-02-09 10:22:30
【问题描述】:
是否可以使用带有通用参数的 JNI 调用本机 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 不支持泛型或者我遗漏了什么?
【问题讨论】:
-
JNI 没有做任何神奇的事情。与 bog 标准 Java 代码一样,您将从哪里创建
T?
标签: java c++ generics java-native-interface