Come creare un mock JNIEnv in C / C ++
-
03-07-2019 - |
Domanda
Sto scrivendo un codice JNI in C che desidero testare usando cunit. Per chiamare le funzioni JNI, devo creare una struttura JNIEnv valida.
Qualcuno sa se esiste un framework beffardo per tale scopo, o chi può darmi alcuni consigli su come creare un JNIEnv finto strutturando me stesso?
Soluzione
jni.h contiene la struttura completa per JNIEnv_, inclusa la tabella di salto "quot" " JNINativeInterface_. Puoi creare il tuo JNINativeInterface_ (indicando implementazioni fittizie) e creare un'istanza di un JNIEnv_ da esso.
Modifica in risposta ai commenti: (non ho esaminato l'altra domanda SO a cui hai fatto riferimento)
#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;
}
Altri suggerimenti
Deridere JNI suona come un mondo di dolore per me. Penso che probabilmente starai meglio deridendo le chiamate implementate in Java e usando Junit per testare la funzionalità sul lato java
Citazione: " jnimock è implementato sopra gmock. Fornisce due classi C ++ 'JNIEnvMock' e 'JavaVMMock' per deridere separatamente 'JNIEnv' e 'JavaVM'. & Quot;