Pull to refresh

Comments 17

Добрый день. Прошу прощения за вопрос «не в кассу». Можно ли как-то в Android Studio вести несколько проектов с использованием общего кода. Есть ли в java нечто аналогично #ifdef и куда при этом пихать переменные препроцессора? Использовать статические переменные не получается, так как нужно подсоединять различные ресурсы strings.xml и color.xml. Наверняка многие сталкивались с такой проблемой.

А вот по поводу «дружбы Java и C++ в одном приложение», очень интересно как обстоят дела с отладкой сишного кода из Android Studio? У меня как-то отладка кода из Cocos2dx так и не задалась, хотя компилировалось все и запускалось нормально.
По первой части вопроса — то можно что-то вроде этого сделать:
    sourceSets {
        main {
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']

            manifest.srcFile 'AndroidManifest.xml'
        }
        refcotor_list {
            java.srcDirs += ['dev/refcotor_list']
            res.srcDirs = ['dev/res']
        }
        old_list {
            java.srcDirs += ['dev/old_list']
        }
    }


таким образом можно создать несколько файлов с ресурсами( и кодом) и выбирать тип сборки какой нужно. Это максимально близкое что можно придумать.

Нащет отладки — то в описанной схеме она по прежнему не возможно, но используя среду Qt Creator можно параллельно сделать проекто-демку, который можно запускать на андроиде и без проблем отлаживать.
Я вижу, что вы отделили ресурсы, но не вижу куда вы подключили refcotor_list и old_list?
Извините за неполный ответ)) Еще нужно дописать что-то вроде этого кода.
buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release
        }
        refcotor_list {
            debuggable true
            signingConfig android.signingConfigs.debug
        }
        old_list {
            debuggable true
            signingConfig android.signingConfigs.debug
        }
    }


После этого можно будет собирать соответственный тип сборки



или же выполнить соответствующую задачу, например assembleRefcotor_list
Большое спасибо!
в данном случае правильние использовать flavor, а не build type.
Согласна. Спасибо за ссылку. Просто, мне картинка выше помогла найти место переключения билдов. Как-то все это не очень очевидно по сравнению с ios), хотя может дело привычки.
Методом тыка нашел в первый день работы с Android Studio.
Я бы посоветовал использовать не такие ужасающие названия методов
JNIEXPORT jstring JNICALL Java_penguin_in_flight_qttests_utils_JavaNatives_sayHello(JNIEnv *env, jobject obj)

а сделать так:
static JNINativeMethod methods[] = {
    {"someMethod", "()Ljava/lang/String;", (void *)someMethod}
};

и в методе
JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved)

зарегистрировать указанные нативные методы
if (env->RegisterNatives(javaClass, methods, sizeof(methods) / sizeof(methods[0])) < 0)
        return JNI_ERR;


В таком случае, вам не нужно будет переименовывать все эти методы, если вдруг понадобиться, например, изменить имя пакета или что-то другое, ну и исчезнут эти монструозные названия методов.

Спасибо большое за совет.
Да действительно удобно.

А вы пробовали SWIG?

Позволяет избежать неприятных моментов несоответствия версий нативного и клиентского кода.
Дополнительное удобство в обработке исключений, стоит нам дописать к методу " throw(std::exception)".
Плюс — подготовленные шаблоны для vector, wstring.
И самое главное он очень гибкий инструмент и не только под Java.

Имхо, незаменимый инструмент для кросс-платформенной разработки на основе C/C++.
Qt под андроид всё также требует дополнительно качать 10-12 МБ (министро вроде, точно не помню) на телефон?
можно так, можно эдак, но с Министро работает лучше. Меньше проблем с потоками, поверхностями, инициализацией. В процессе вылавливания проблем с чёрным экраном на ровном месте и теряющимися сообщениями (т.к. parent is in other thread) перешёл на Министро и начал спать спокойно.
А как у вас дела с отладкой нативной библиотеки в таком случае обстоит?

Эти сценарии мне не очень-то помогли:
github.com/mapbox/mapbox-gl-native/wiki/Android-debugging-with-remote-GDB
geekswithblogs.net/raccoon_tim/archive/2011/09/12/working-with-android-on-windows-and-without-cygwin.aspx
comments.gmane.org/gmane.comp.lib.qt.android/3462

Видимо руки кривые… :(
Отладка нативного кода на Андроиде — это боль. У меня она регулярно ломается по непонятным причинам. Т. е. буквально: сегодня работает, прихожу утром на следующий день — не работает. И это в Эклипсе, под который больше гайдов и советов на SO.
Ещё и банальные вещи вроде визуализации std::vector Эклипс не умеет.
Извините, накипело.
Ну примерно это я и ожидал услышать. Имхо, это настоящий ад)

Вычитав первое предложение этой статьи, я рассчитывал увидеть как подружить Qt Creator + gradle + Java (о которой возможности было заявлено разработчиками)…

Суть моей проблемы в том, что мне приходится использовать ту же Android Studio. IDE которую используют Android-разработчики, клиенты моей библиотеки. И в этом проекте используется gradle. А так же Google Maps SDK — где я переопределяю тайловый провайдер и заполняю его нативной начинкой. Т.е. локальный рендеринг карты. Да сценарий не самый лучший, но не я его инициатор.

Саму библиотеку я разрабатываю под Qt Creator'ом — удобно, если привыкнуть (тот же alt+enter под Windows). И с отладкой в нем проблем нет, если на выходе приложение, а не .so модуль (std::vector вполне читаем).

В итоге получается что на данный момент есть плавающий баг, который повторяется только Java-приложении с .so библиотекой. И разобраться в чем именно проблема не получается.

Вообщем попробую Eclipse. Спасибо, за комментарий.

Sign up to leave a comment.

Articles