La complicación aquí es que desea invocar código nativo C++ que, a su vez, desea invocar un método Java. Esto es realmente un poco complicado.
Necesita crear una función JNI C++ para llamar a java, y una función C++ que coincida con la firma de devolución de llamada MyCPPFunction. Este último actuará como un contenedor para llamar al método java.
Debido a que la envoltura se necesita información sobre el entorno JNI, que no puede ser proporcionada por los parámetros (para que no arruinar la firma) se crea un par de variables globales para sostenerlo:
jobject g_getSizeIface;
jmethodID g_method;
JNIEnv *g_env;
La función de C++, que java se llame es la siguiente:
JNIEXPORT void JNICALL Java_ClassName_MyCPPFunction
(JNIEnv *env, jint size, jobject getSizeInterface)
{
jclass objclass = env->GetObjectClass(getSizeInterface);
jmethodID method = env->GetMethodID(objclass, "GetSize", "(m_SizeClass)I");
if(methodID == 0){
cout << "could not get method id!\n";
return;
}
g_method = method;
g_getSizeIface = getSizeInterface;
g_env = env
MyCPPFunction(size, WrapperFunc);
}
Y la función de contenedor es así:
int WrapperFunc(int *id)
{
jint retval;
//marshalling an int* to a m_SizeClass boogy-woogy.
...
g_env->ExceptionClear();
retval = g_env->CallIntMethod(g_getSizeIface, g_method,
/*marshalled m_SizeClass*/);
if(g_env->ExceptionOccured()){
//panic! Light fires! The British are coming!!!
...
g_env->ExceptionClear();
}
return rvalue;
}
podemos tener code..what muestra funcional completa será la declaración en la capa de Java? – CoDe
¿Qué sucede si se necesita registrar la devolución de llamada con código nativo varias veces (pasando diferentes implementaciones de interfaz), de modo que cada registro de WrapperFunc tenga un objeto/método de interfaz asociado para invocar – xorcus