Frage

Ich schreibe einige JNI Code in C, die ich möchte mit cunit testen. Um die JNI-Funktionen aufzurufen, ich brauche eine gültige JNIEnv Struktur zu erstellen.

Wer weiß, ob es einen Mockframework für einen solchen Zweck ist, oder wer kann mir einige Hinweise geben, wie ein Mock JNIEnv struct selbst erstellen?

War es hilfreich?

Lösung

jni.h enthält die komplette Struktur für JNIEnv_, einschließlich der "jump table" JNINativeInterface_. Sie könnten Ihre eigene JNINativeInterface_ (zeigt auf Mock-Implementierungen) erstellen und ein JNIEnv_ davon instanziiert.

In Reaktion auf den Kommentare: (I nicht am anderen aussehen SO Frage, die Sie verweisen)

#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;
}

Andere Tipps

Mocking JNI klingt wie eine Welt des Schmerzes zu mir. Ich glaube, Sie sind wahrscheinlich besser dran, die Anrufe in Java implementiert spöttisch und mit JUnit die Funktionalität auf der Java-Seite zu testen

Zitat: ". Jnimock oben auf gmock implementiert Es bietet zwei C ++ Klassen 'JNIEnvMock' und 'JavaVMMock' separat mock 'JNIEnv' und 'JavaVM'"

https://github.com/ifokthenok/jnimock

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top