我有一个使用原生 C++ 库的 Android 项目。一些库方法是通过 JNI 从 Java 端调用的。我想用 Java 编写一个仪器测试来测试我的 JNI 实现(不是 native 库;我想确保我的 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 中设置“测试”标志?
我试过了
testOptions {
properties.put("test", "true")
}
然后在我设置 Cmake 参数之前检查 testOptions.properties 是否包含“test”键,但这总是返回 false。
我不太擅长 gradle,我可能错过了一个明显的方法。
最佳答案
最后我采取了不同的方法来实现我想要的。
我了解到,在构建 native 库之前,不可能将 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 检测测试。
关于android - 修改 gradle 中的 cmake 参数以使用 C++ 库在 Android 项目中进行检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53172776/