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

标签 android c++ gradle cmake

我有一个使用原生 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/

相关文章:

android - Activity fragment

android - 设置动态服务器

c++ - 在链表 C++ 的索引处插入一个元素

c++ - 使用 CMake 将编译器标志附加到文件

java - 为Scala和Java测试提供Gradle单独的测试类路径依赖项

android - BuildConfig:属性值必须恒定

java - 添加 firebase 与 google play 服务冲突

android - 用于 NFC 设备身份验证的 AES 与 3DES (Mifare)

c++ - unordered_map查找数组的索引

android - Gradle 清理构建问题