如何在 C/C 中创建 JNIEnv 模拟

发布于 2024-07-07 09:40:27 字数 141 浏览 9 评论 0原文

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

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

I am writing some JNI code in C that I wish to test using cunit. In order to call the JNI functions, I need to create a valid JNIEnv struct.

Does anyone know if there is a mocking framework for such a purpose, or who can give me some pointers on how to create a mock JNIEnv struct myself?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

橙幽之幻 2024-07-14 09:40:27

jni.h 包含 JNIEnv_ 的完整结构,包括“跳转表”JNINativeInterface_。 您可以创建自己的 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.h contains the complete structure for JNIEnv_, including the "jump table" JNINativeInterface_. You could create your own JNINativeInterface_ (pointing to mock implementations) and instantiate a JNIEnv_ from it.

Edit in response to comments: (I didn't look at the other SO question you referenced)

#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;
}
萌逼全场 2024-07-14 09:40:27

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

Mocking JNI sounds like a world of pain to me. I think you are likely to be better off mocking the calls implemented in Java, and using Junit to test the functionality on the java side

愁杀 2024-07-14 09:40:27

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

https://github.com/ifokthenok/jnimock

Quote: "jnimock is implemented on top of gmock. It provides two C++ classes 'JNIEnvMock' and 'JavaVMMock' to separately mock 'JNIEnv' and 'JavaVM'."

https://github.com/ifokthenok/jnimock

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文