Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在C/C++;_C++_C_Mocking_Java Native Interface_Cunit - Fatal编程技术网

C++ 如何在C/C++;

C++ 如何在C/C++;,c++,c,mocking,java-native-interface,cunit,C++,C,Mocking,Java Native Interface,Cunit,我正在用C编写一些JNI代码,希望使用cunit进行测试。为了调用JNI函数,我需要创建一个有效的JNIEnv结构 有没有人知道是否有一个模拟框架用于此目的,或者谁能给我一些关于如何自己创建模拟JNIEnv结构的建议?对我来说,模拟JNI听起来像是一个痛苦的世界。我认为您最好模拟用Java实现的调用,并使用Junit测试Java端的功能。jni.h包含JNIEnv_u的完整结构,包括“跳转表”JNINativeInterface。您可以创建自己的JNINativeInterface(指向模拟实现

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


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

对我来说,模拟JNI听起来像是一个痛苦的世界。我认为您最好模拟用Java实现的调用,并使用Junit测试Java端的功能。jni.h包含JNIEnv_u的完整结构,包括“跳转表”JNINativeInterface。您可以创建自己的JNINativeInterface(指向模拟实现)并从中实例化JNIEnv

根据评论编辑:(我没有看你提到的其他问题)

#包括“jni.h”
#包括
jint JNICALL MockGetVersion(JNIEnv*)
{
返回23;
}
JNINativeInterface_ujnini={
0,0,0,0,//4个保留指针
模拟版本
};
//类Foo{public static native void bar();}
void Java_Foo_bar(JNIEnv*jni,jclass)
{
STD::CUT GETVIEWONE()

引用:“JNIMOK是在GMOCK之上实现的。它提供了两个C++类的JNEN VMOKK和JavaVMMOK”分别模拟“JNENV”和“Javavm”。


是的,这就是我认为我需要做的。不过,为了让生活方式更有趣,Sun毫无帮助地将JNIEnv结构设置为常量,因此它覆盖其中的函数指针成为一项非常重要的任务。如果您感兴趣,请列出将指针更改到此常量结构上的其中一个问题的解决方案你的建议的问题是,通过Java测试代码不是单元测试,因为它要经过JNI。如果失败,可能是因为Java代码、C/Java数据类型匹配、C coce、JNI中的错误等。继续……因此,如果我要正确地对JNI C代码进行单元测试,我必须模拟JNI并从内部调用C函数C代码。你可能是对的,我没有做JNI一段时间,但是它是C/java数据类型匹配,看起来很难模仿。我个人认为包装C/java接口,并嘲笑它。请看我的答案的编辑版本,它包括一个完整的C++程序,带有模拟JNI函数实现。
#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;
}