我正在用 C 语言编写一些希望使用 cunit 进行测试的 JNI 代码。为了调用 JNI 函数,我需要创建一个有效的 JNIEnv 结构。
有谁知道是否有用于此目的的模拟框架,或者谁能给我一些关于如何自己创建模拟 JNIEnv 结构的指示?
我正在用 C 语言编写一些希望使用 cunit 进行测试的 JNI 代码。为了调用 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'。”