使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
Modify cmake arguments in gradle for instrumented tests in Android project with C++ library
我有一个使用本机C++库的Android项目。一些库方法是通过JNI从Java端调用的。我想用Java编写一个工具测试,测试我的JNI实现(而不是本机库;我想确保我的JNI代码正常工作(。我的计划是使用一个模拟的C++类,当测试运行时,它将在与真实类相同的JNI方法中实例化。我想通过在build.gradle中向cmake传递一个参数来实现这一点。我的问题是:在build.gradle中,我如何区分运行测试和真正的应用程序运行?
更多细节与一些代码:
我的JNI代码:
#define JNI_METHOD(return_type, method_name) JNIEXPORT return_type JNICALL Java_com_myproj_Session_##method_name
extern "C" {
std::shared_ptr<my::ISession> session;
JNI_METHOD(void, init)(JNIEnv *env, jobject) {
// want I want to do here:
#ifdef TESTCONFIG
session = std::make_shared<my::MockedSession>()
#else
session = std::make_shared<my::Session>();
#endif
}
在上面的例子中,Session和MockedSession都将继承ISession。
然后,在build.gradle中,我设置了CMake参数:
externalNativeBuild {
cmake {
cppFlags "-std=c++11", "-Wall"
arguments "-DANDROID_STL=c++_static"
// here I want to do the following:
if (test) {
arguments "-DTESTCONFIG"
}
}
}
如何在build.gradle中设置"test"标志?我试过
testOptions {
properties.put("test", "true")
}
然后在我设置Cmake参数之前检查testOptions.properties是否包含"test"键,但总是返回false。我对gradle不太好,我可能错过了一条明显的路。
最后,我采取了不同的方法来实现我想要的。
我了解到,在构建本机库之前,不可能将test=true标志从Gradle传递到c++类,因为Gradle根本不知道它是为测试还是为实际运行而构建的。所以添加cmake参数是行不通的,就像试图修改或添加Gradle任务一样。
我做了什么:
在我的JNI代码中:
#define JNI_METHOD(return_type, method_name) JNIEXPORT return_type JNICALL Java_com_myproj_Session_##method_name
extern "C" {
std::shared_ptr<my::ISession> session;
// flag for running tests
bool isTest = false;
JNI_METHOD(void, init)(JNIEnv *env, jobject) {
if (isTest) {
session = std::make_shared<my::MockedSession>();
}
else {
session = std::make_shared<my::Session>()
}
}
// for tests - set test run
JNI_METHOD(void, setTestRun)(JNIEnv *env, jobject thisObj, jboolean isTestRun) {
isTest = (bool)isTestRun;
}
}
在我的Session.java类中,添加了一个方法来设置测试标志,具有包访问级别,因此它对测试可见,但对我的库用户不可见
native void setTestRun(boolean isTest);
然后在我的测试SessionTest.java中,我调用
Session session = new Session();
session.setTestRun(true);
通过这种方式,我可以将模拟C++类用于Java指令测试。
相关文章:
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 使用在用于SFINAE的void_t中具有参数的方法
- 用于检查值是否为其任何参数的帮助程序函数
- 为什么可变参数函数不适用于模板
- 为什么数组大小信息可用于"sizeof"运算符和 delete[] 运算符,但在将数组作为参数传递到
- 一个模板方法,用于同时接受常量和非常量参数
- Constexpr 可变参数模板,用于对无符号整数进行重新排序
- 使用一个参数的模板函数时出错(适用于 2)
- 为什么模板参数推导不适用于仅指定前两个参数的可变参数模板类?
- 隐式生成的函数重载用于右值参数?
- 为什么带有类型参数的运算符 () 可以应用于 result_of 上下文中的类型?
- 将非 const 对象用于 const 参数
- 模板 ctor 类型推导不起作用(没有匹配的构造函数用于初始化 ...)与函数<>参数
- 用户定义的转换不适用于可变参数函数参数?为什么不呢?
- 如何修复用于根据参数返回不同类型的模板类中的错误C2679?
- 用于接收通用地图作为参数的模板函数
- SFINAE 用于具有默认参数的函数对象
- C++具有可变参数专用参数的模板,用于参数数量
- 在C++函数 WriteFile 和 ReadFile 中用于参数 LPVOID lpBuffer 的变量类型
- 如何动态地确定用于参数化模板的类型并对它们进行比较