Android Studio Android Projekt работает автономно Java

Привет, я запрограммировал приложение для Android, но некоторые части приложения содержат собственный код Desktop-Java, который должен запускаться на рабочем столе, прямо сейчас я могу просто запустить его в Android Studio, и он работает, библиотеки Android предоставляются в виде «заглушек» ", но я хочу экспортировать его и запустить без Android Studio. Но я не имею ни малейшего представления, с чего начать. Я не хочу создавать модуль Java, потому что это несколько раз разрушало мое приложение. Любая идея? Я знаю, что смешивать Desktop-Java с Android - это плохой дизайн, но мне в любом случае нужен почти весь код Desktop-Java для Android-приложения.

Просто скопировал строку запуска в windows-cmd, и она работает даже без студии Android, но я не думаю, что она будет работать в любой другой среде выполнения, кроме моего ПК.

"C:\Program Files\Android\Android Studio\jre\bin\java" -Didea.launcher.port=55051 "-Didea.launcher.bin.path=C:\Program Files\Android\Android Studio\bin" -Dfile.encoding=UTF-8 -classpath "C:\Users\tw\AppData\Local\Android\sdk\platforms\android-26\android.jar;C:\Users\tw\AppData\Local\Android\sdk\platforms\android-26\data\res;F:\zwei18\blubberme\app\build\intermediates\classes\debug;F:\zwei18\blubberme\app\build\generated\res\rs\debug;F:\zwei18\blubberme\app\build\generated\res\resValues\debug;C:\Users\tw\.gradle\caches\transforms-1\files-1.1\animated-vector-drawable-26.0.0.aar\b4b915afcc06edc72907953989a6a029\jars\classes.jar;C:\Users\tw\.gradle\caches\modules-2\files-2.1\com.android.support\support-annotations\26.0.0\db09a97f4f0db8892c1a0111a4b966f97920d082\support-annotations-26.0.0.jar;C:\Users\tw\.gradle\caches\transforms-1\files-1.1\transition-26.0.0.aar\2216ab7388ea55822f0426346701ad90\jars\classes.jar;C:\Users\tw\.gradle\caches\transforms-1\files-1.1\transition-26.0.0.aar\2216ab7388ea55822f0426346701ad90\res;C:\Users\tw\.gradle\caches\transforms-1\files-1.1\appcompat-v7-26.0.0.aar\b621d0ffa5f7edf4f78d6d69c706bedb\res;C:\Users\tw\.gradle\caches\transforms-1\files-1.1\appcompat-v7-26.0.0.aar\b621d0ffa5f7edf4f78d6d69c706bedb\jars\classes.jar;C:\Users\tw\.gradle\caches\transforms-1\files-1.1\multidex-1.0.1.aar\73331bbce451c5905e18bb668d168a8a\jars\classes.jar;C:\Users\tw\.gradle\caches\transforms-1\files-1.1\support-fragment-26.0.0.aar\6cc4503602a68fc2387dc2bb33451a65\jars\classes.jar;C:\Users\tw\.gradle\caches\transforms-1\files-1.1\support-media-compat-26.0.0.aar\a2a3417028259290b6250bb82e1eef66\res;C:\Users\tw\.gradle\caches\transforms-1\files-1.1\support-media-compat-26.0.0.aar\a2a3417028259290b6250bb82e1eef66\jars\classes.jar;C:\Users\tw\.gradle\caches\transforms-1\files-1.1\constraint-layout-1.1.3.aar\a8e8a3da9d5281847b733c2283a691f2\res;C:\Users\tw\.gradle\caches\transforms-1\files-1.1\constraint-layout-1.1.3.aar\a8e8a3da9d5281847b733c2283a691f2\jars\classes.jar;C:\Users\tw\.gradle\caches\transforms-1\files-1.1\support-compat-26.0.0.aar\9a143a52b1b5faf3d74042078d3bb91b\jars\classes.jar;C:\Users\tw\.gradle\caches\transforms-1\files-1.1\support-compat-26.0.0.aar\9a143a52b1b5faf3d74042078d3bb91b\res;C:\Users\tw\.gradle\caches\transforms-1\files-1.1\support-v4-26.0.0.aar\13c2be756832554a53d9af310221de3e\jars\classes.jar;C:\Users\tw\.gradle\caches\transforms-1\files-1.1\support-core-ui-26.0.0.aar\6fc1ad2c887486268d973e3de820567f\jars\classes.jar;C:\Users\tw\.gradle\caches\transforms-1\files-1.1\support-core-utils-26.0.0.aar\e4079133536e59e184d0ec91ca10bdb0\jars\classes.jar;C:\Users\tw\.gradle\caches\transforms-1\files-1.1\support-vector-drawable-26.0.0.aar\f003cfe0156b60b8e5a69079c81066d9\jars\classes.jar;C:\Users\tw\.gradle\caches\transforms-1\files-1.1\design-26.0.0.aar\805dec2c6983e4269fe7d92ec69e5bc8\jars\classes.jar;C:\Users\tw\.gradle\caches\transforms-1\files-1.1\design-26.0.0.aar\805dec2c6983e4269fe7d92ec69e5bc8\res;C:\Users\tw\.gradle\caches\modules-2\files-2.1\com.android.support.constraint\constraint-layout-solver\1.1.3\bde0667d7414c16ed62d3cfe993cff7f9d732373\constraint-layout-solver-1.1.3.jar;C:\Users\tw\.gradle\caches\transforms-1\files-1.1\recyclerview-v7-26.0.0.aar\cb0f3040d8654b9aee1823550cea3508\jars\classes.jar;C:\Users\tw\.gradle\caches\transforms-1\files-1.1\recyclerview-v7-26.0.0.aar\cb0f3040d8654b9aee1823550cea3508\res;C:\Program Files\Android\Android Studio\lib\idea_rt.jar" com.intellij.rt.execution.application.AppMainV2 s.blubberme.engine.physics.Networks.ServerListenLoop

Проголосовали и задали вопрос: работает ли ваш Java-код для настольных ПК на рабочем столе или на Android?

Geno Chen 01.12.2018 05:39

Рабочий стол, эмулятор не нужен

Daniel Craig 01.12.2018 05:47
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
66
2

Ответы 2

Я сделал это следующим образом:

Поместите весь основной код в настольный проект с помощью файла сборки gradle. Поместите содержимое рабочего стола в другой проект рабочего стола. Поместите специфические вещи для Android в студию Android. Используйте jar-файл, который создается основным проектом, в каждом из других проектов.

Дополнительным бонусом является то, что он упрощает модульное тестирование основного кода очень.

См. Пример ниже. В версии для Android должен был быть установлен обратный вызов.

interface Factory {
    Audio create();
    class FactoryImpl implements Factory {
        private FactoryImpl() {}
        @Override public Audio create() {
            return isAndroid()?new AndroidAudio():new WindowsAudio();
        }
        public static class AndroidAudio implements Audio {
            AndroidAudio() {}
            @Override public void play(Sound sound) {
                if (Audio.Instance.sound) if (consumer!=null) consumer.accept(sound);
                else l.severe("callback is not set: "+sound);
            }
            public void setCallback(Consumer<Sound> consumer) {
                this.consumer=consumer;
            }
            public Consumer<Sound> consumer;
        }
        private static class WindowsAudio implements Audio {
            WindowsAudio() {}
            @Override public void play(final Sound sound) {
                if (Audio.Instance.sound) try {
                    String filename=sound.name()+".wav";
                    l.info("play: "+filename);
                    Clip clip=AudioSystem.getClip();
                    AudioInputStream inputStream=AudioSystem.getAudioInputStream(new BufferedInputStream(Audio.class.getResourceAsStream(filename)));
                    if (inputStream!=null) {
                        clip.open(inputStream);
                        FloatControl gainControl=(FloatControl)clip.getControl(FloatControl.Type.MASTER_GAIN);
                        gainControl.setValue(-25.0f); // ?
                        clip.start();
                        // maybe do not wait?
                        while(clip.getMicrosecondLength()!=clip.getMicrosecondPosition())
                            Thread.sleep(1); // wait
                        // or at least don't wait here?
                        //Thread.sleep(500);
                        clip.close();
                    } else l.warning("input stream is null!");
                } catch(Exception e) {
                    e.printStackTrace();
                    l.severe("caught: "+e);
                    l.severe("failed to play: "+sound);
                }
            }
        }
    } }

привет, я знаю, что это может быть правильное решение, но я хочу избежать его, так как тогда мне пришлось переписать много кода. У меня есть код вроде "void dosomething () {if (isdesktop) {dosomething} else if (android) {dosomething else}", поэтому для настольного кода требуются библиотеки Android, по крайней мере, как заглушка

Daniel Craig 01.12.2018 06:31

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

Ray Tayek 02.12.2018 02:52

В Ява (Android Studio 3.4.1) достаточно включить в любой исходный файл .class статический метод main.

public static void main(String[] args){
    System.out.println("Hello World! ");
   // your code
}

Программирую в Котлин. Котлин полностью совместим с Ява. В контексте, это похоже. Один включает в некоторый исходный файл .kt функцию main:

fun main()  {
   println("Hello World")
   // your code
}

В обоих случаях слева от основной функции появится green triangle icon.

Таким образом, можно запустить основной функциональный код на рабочем столе (без эмулятора или мобильного телефона), щелкнув green triangle icon. Похоже варианты, включая отладку. Ярлык: Ctrl +Shift + F10

green triangle icon и green bug icon на верхней панели инструментов также позволяют слева выбрать правый модуль (который имеет внутри главную функцию) и запустить его вместо appgreen ET head icon). Ярлык: Shift+F10

Другие вопросы по теме