使用C ++库在gradle中修改cmake参数以进行Android项目中的测试

时间:2018-11-06 13:21:16

标签: android c++ gradle cmake

我有一个使用本机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中设置“测试”标志? 我尝试过

 testOptions {
      properties.put("test", "true")
}

,然后在设置Cmake参数之前检查testOptions.properties是否包含“ test”键,但始终返回false。 我对gradle不太满意,我可能想念一个明显的方法。

1 个答案:

答案 0 :(得分:0)

最后,我采用了不同的方法来实现自己想要的目标。

我了解到在构建本机库之前不可能将Gradle的test = true标志传递给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测试。