Вопрос

Я пишу код 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».

https://github.com/ifokthenok/jnimock

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top