Cómo crear un simulacro de JNIEnv en C / C ++
-
03-07-2019 - |
Pregunta
Estoy escribiendo un código JNI en C que deseo probar usando cunit. Para poder llamar a las funciones JNI, necesito crear una estructura JNIEnv válida.
¿Alguien sabe si existe un marco burlón para tal propósito, o quién me puede dar algunos consejos sobre cómo crear una estructura JNIEnv simulada?
Solución
jni.h contiene la estructura completa para JNIEnv_, incluida la " tabla de saltos " Interfaz JNINative_. Puedes crear tu propio JNINativeInterface_ (que apunta a implementaciones simuladas) y crear una instancia de JNIEnv_
Edite en respuesta a los comentarios: (no miré la otra pregunta SO a la que hizo referencia)
#include "jni.h"
#include <iostream>
jint JNICALL MockGetVersion(JNIEnv *)
{
return 23;
}
JNINativeInterface_ jnini = {
0, 0, 0, 0, //4 reserved pointers
MockGetVersion
};
// class Foo { public static native void bar(); }
void Java_Foo_bar(JNIEnv* jni, jclass)
{
std::cout << jni->GetVersion() << std::endl;
}
int main()
{
JNIEnv_ myjni = {&jnini};
Java_Foo_bar(&myjni, 0);
return 0;
}
Otros consejos
La burla de JNI me parece un mundo de dolor. Creo que es probable que sea mejor burlarse de las llamadas implementadas en Java y usar Junit para probar la funcionalidad en el lado de Java
Cita: " jnimock se implementa encima de gmock. Proporciona dos clases de C ++ 'JNIEnvMock' y 'JavaVMMock' para simular por separado 'JNIEnv' y 'JavaVM'. & Quot;