Có thể gọi một hàm CPP gốc bằng JNI có các đối số chung không? Giống như sau:Generics Java và JNI
public static native <T, U, V> T foo(U u, V v);
và sau đó gọi nó thích:
//class Foo, class Bar, class Baz are already defined;
Foo f = foo(new Bar(), new Baz());
bất cứ ai có thể vui lòng cung cấp cho tôi với một mẫu được thực sự làm điều này hoặc một số hướng dẫn trên mạng mà thực hiện điều này? Tôi hỏi vì trong chức năng CPN JNI của tôi (gọi là JVM), tôi nhận được lỗi liên kết không hài lòng.
CPP Mã sau:
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);
}
EDIT:
Tôi đã thử bằng cách sửa đổi mã nhưng bây giờ tôi nhận được NoSuchMethodError:
đangJava:
public static native <U, V> String foo(U u, V v);
//...
String str = foo(new Bar(), new Baz());
Mã 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);
}
Điều này có nghĩa là JNI không hỗ trợ cho generics hoặc tôi thiếu gì đó?
JNI không làm bất kỳ điều gì kỳ diệu. Như với mã Java chuẩn bog, bạn sẽ tạo 'T' từ đâu? –