Модифицировать аргументы cmake в gradle для инструментальных тестов в проекте Android с библиотекой C ++ - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть проект Android, который использует собственную библиотеку C ++. Некоторые библиотечные методы вызываются из Java через JNI. Я хочу написать инструментальный тест на Java, который бы тестировал мою реализацию JNI (не нативную библиотеку; я хочу убедиться, что мой код JNI работает правильно). Я планирую использовать для этого фиктивный класс C ++, который будет создан в том же методе JNI, что и реальный класс во время выполнения теста. Я думал достичь этого путем передачи параметра в cmake внутри build.gradle. Моя проблема: в 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"
                }
            }
        }

Как мне установить флаг 'test' в build.gradle? Я пытался

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

, а затем проверьте, содержат ли testOptions.properties ключ «test», прежде чем устанавливать параметры Cmake, но это всегда возвращает false. Я не слишком хорош в Gradle, я, вероятно, скучаю по очевидному пути.

1 Ответ

0 голосов
/ 15 ноября 2018

В итоге я выбрал другой подход для достижения того, чего хотел.

Я узнал, что невозможно передать флаг 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...