Привет, я запрограммировал приложение для 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
Рабочий стол, эмулятор не нужен




Я сделал это следующим образом:
Поместите весь основной код в настольный проект с помощью файла сборки 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, по крайней мере, как заглушка
возможно, вам придется перепрыгнуть через несколько обручей, но оно того стоит. см. мое редактирование.
В Ява (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 на верхней панели инструментов также позволяют слева выбрать правый модуль (который имеет внутри главную функцию) и запустить его вместо app (с green ET head icon). Ярлык: Shift+F10
Проголосовали и задали вопрос: работает ли ваш Java-код для настольных ПК на рабочем столе или на Android?