4

我正在用 C 语言编写一些希望使用 cunit 进行测试的 JNI 代码。为了调用 JNI 函数,我需要创建一个有效的 JNIEnv 结构。

有谁知道是否有用于此目的的模拟框架,或者谁能给我一些关于如何自己创建模拟 JNIEnv 结构的指示?

4

3 回答 3

3

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;
}
于 2008-10-14T23:49:14.540 回答
1

嘲笑 JNI 对我来说听起来像是一个痛苦的世界。我认为你可能会更好地模拟在 Java 中实现的调用,并使用 Junit 来测试 Java 端的功能

于 2008-10-14T14:48:30.653 回答
0

引用:“jnimock 是在 gmock 之上实现的。它提供了两个 C++ 类 'JNIEnvMock' 和 'JavaVMMock' 来分别模拟 'JNIEnv' 和 'JavaVM'。”

https://github.com/ifokthenok/jnimock

于 2017-02-25T01:08:14.660 回答