Como criar um mock JNIEnv em C / C ++
-
03-07-2019 - |
Pergunta
Estou a escrever algum código JNI em C que gostaria de teste usando cunit. A fim de chamar as funções JNI, eu preciso criar um struct JNIEnv válido.
Alguém sabe se existe um quadro de zombaria para tal finalidade, ou quem pode me dar algumas dicas sobre como criar um JNIEnv simulada me struct?
Solução
jni.h contém a estrutura completa para JNIEnv_, incluindo a "mesa salto" JNINativeInterface_. Você pode criar seu próprio JNINativeInterface_ (apontando para implementações de simulação) e instanciar um JNIEnv_ dela.
Editar em resposta aos comentários: (eu não olhar para o outro SO pergunta você referenciou)
#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;
}
Outras dicas
Mocking JNI soa como um mundo de dor para mim. Eu acho que são susceptíveis de ser melhor zombando das chamadas implementadas em Java, e usando JUnit para testar a funcionalidade do lado do java
Citação: ". Jnimock é implementado em cima do gmock Ele fornece duas classes C ++ 'JNIEnvMock' e 'JavaVMMock' para separadamente simulada 'JNIEnv' e 'JavaVM'"