Как создать макет JNIEnv на C/C++
-
03-07-2019 - |
Вопрос
Я пишу код JNI на C, который хочу протестировать с помощью cunit.Чтобы вызвать функции JNI, мне нужно создать действительную структуру JNIEnv.
Кто-нибудь знает, существует ли для этой цели макетная структура, или кто может дать мне несколько советов о том, как самому создать макетную структуру JNIEnv?
Решение
jni.h содержит полную структуру JNIEnv_, включая «таблицу переходов» JNINativeInterface_.Вы можете создать свой собственный JNINativeInterface_ (указывая на макет реализации) и создать из него экземпляр JNIEnv_.
Редактировать в ответ на комментарии:(Я не смотрел на другой вопрос SO, на который вы ссылались)
#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;
}
Другие советы
Для меня насмешка над JNI звучит как настоящая боль.Я думаю, вам, вероятно, будет лучше издеваться над вызовами, реализованными на Java, и использовать Junit для проверки функциональности на стороне Java.
Цитировать:«jnimock реализован поверх gmock.Он предоставляет два класса C++ «JNIEnvMock» и «JavaVMMock» для отдельного макетирования «JNIEnv» и «JavaVM».