¿Es posible llamar a una función CPP nativa usando JNI que toma argumentos genéricos? Algo así como lo siguiente:Java genéricos y JNI
public static native <T, U, V> T foo(U u, V v);
Y luego llamar así:
//class Foo, class Bar, class Baz are already defined;
Foo f = foo(new Bar(), new Baz());
Puede alguien por favor me proporcione una muestra que en realidad está haciendo esto o algún tutorial en la red que hace esto? Lo estoy preguntando porque en mi función CPP JNI (llamada por JVM), obtengo un error de enlace insatisfecho.
Código CPP sigue:
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:
He tratado mediante la modificación del código, pero ahora estoy consiguiendo NoSuchMethodError:
códigoJava:
public static native <U, V> String foo(U u, V v);
//...
String str = foo(new Bar(), new Baz());
CPP code:
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);
}
¿Esto significa que JNI no tiene soporte para los genéricos o me falta algo?
JNI no hace nada mágico. Al igual que con el código Java estándar de pantano, ¿de dónde crearías una 'T'? –