문제

Cunit을 사용하여 테스트하고 싶은 C로 JNI 코드를 작성하고 있습니다. JNI 기능을 호출하려면 유효한 Jnienv 구조물을 만들어야합니다.

그러한 목적을위한 조롱 프레임 워크가 있는지 또는 누가 조롱 Jnienv struct를 직접 만드는 방법에 대한 조언을 줄 수 있는지 아는 사람이 있습니까?

도움이 되었습니까?

해결책

Jni.h에는 "점프 테이블"JninativeInterface_를 포함하여 Jnienv_의 완전한 구조가 포함되어 있습니다. 자신만의 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;
}

다른 팁

JNI를 조롱하는 것은 나에게 고통의 세계처럼 들립니다. Java에서 구현 된 통화를 조롱하고 Junit을 사용하여 Java 측의 기능을 테스트하는 것이 더 나을 것이라고 생각합니다.

인용문 : "Jnimock은 Gmock 위에 구현되었습니다. 두 개의 C ++ 클래스 'Jnienvmock'과 'javavmmock'을 제공하여 'jnienv'와 'javavm'을 개별적으로 조롱합니다."

https://github.com/ifokthenok/jnimock

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top