Как создать макет JNIEnv в C / C ++ - PullRequest
3 голосов
/ 14 октября 2008

Я пишу некоторый код JNI на C, который я хочу протестировать с помощью cunit. Для вызова функций JNI мне нужно создать допустимую структуру JNIEnv.

Кто-нибудь знает, есть ли для этой цели фальшивый фреймворк, или кто подскажет, как создать фиктивную структуру JNIEnv самостоятельно?

Ответы [ 3 ]

2 голосов
/ 15 октября 2008

jni.h содержит полную структуру для JNIEnv_, включая «таблицу переходов» JNINativeInterface_. Вы можете создать свой собственный JNINativeInterface_ (указывающий на фиктивные реализации) и создать из него JNIEnv_.

Изменить в ответ на комментарии: (Я не смотрел на другой вопрос, на который вы ссылались)

#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;
}
0 голосов
/ 25 февраля 2017

Цитата: "jnimock реализован поверх gmock. Он предоставляет два класса C ++ 'JNIEnvMock' и 'JavaVMMock' для раздельного макета JNIEnv и JavaVM."

https://github.com/ifokthenok/jnimock

0 голосов
/ 14 октября 2008

Дразнящий JNI звучит как мир боли для меня. Я думаю, что вам, вероятно, будет лучше издеваться над вызовами, реализованными в Java, и использовать Junit для проверки функциональности на стороне Java

...