質問

cunitを使用してテストしたいJNIコードをCで記述しています。 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で実装された呼び出しをモックし、Java側でJunitを使用して機能をテストする方が良いと思います

引用:&quot; jnimockはgmockの上に実装されています。 2つのC ++クラス「JNIEnvMock」と「JavaVMMock」を提供して、「JNIEnv」と「JavaVM」を個別にモックします。&quot;

https://github.com/ifokthenok/jnimock

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top