Запуск java для android

How to run Java programs directly on Android (without creating an APK)

A step by step instruction for compiling a Java program into an Android executable and using ADB to run it.

When you want to create a system / commandline tool for Android, you have to write it in C(++)… or do you? TLDR; here’s the final proof of concept. Sticking with Java would have the benefit of avoiding all of the native ABI hassle and also being able to call into the Android runtime. So how do we do that?

A (not so) simple Hello World program

Let’s start with the Java program we want to run. In order to make it a bit more interesting (and because any useful program has dependencies), it won’t just print the obligatory “Hello World” message, but also use the Apache Commons CLI library to parse its commandline arguments:

package com.example; import org.apache.commons.cli.DefaultParser; import org.apache.commons.cli.HelpFormatter; import org.apache.commons.cli.Option; import org.apache.commons.cli.Options; import org.apache.commons.cli.ParseException; public class HelloWorld  public static void main(String[] args) throws ParseException  Option version = new Option("v", "Print version"); Option help = new Option("h", "Print help"); Options options = new Options(); options.addOption(help); options.addOption(version); for (Option opt : new DefaultParser().parse(options, args).getOptions())  if (opt.equals(version))  String os = System.getProperty("os.arch"); System.out.println("Hello World (" + os + ") v0.1"); > if (opt.equals(help))  new HelpFormatter().printHelp("Hello World", options); > > > >

Setting up the working directory

We will have to manually run several commandline tools in the next step, assuming the following final directory structure:

. ├── android-sdk-linux │ └── build-tools │ └── 23.0.2 │ └── dx ├── bin │ └── com │ └── example │ └── HelloWorld.class ├── lib │ └── commons-cli-1.3.1.jar ├── src │ └── com │ └── example │ └── HelloWorld.java ├── helloworld.jar └── helloworld.sh
  • Android SDK (either via Android Studio or the SDK Manager). NOTE: If you are an Android developer, you’ll have the Android SDK already installed. In that case, you don’t actually need to copy it to the working directory as long as you know the path to the dx tool.
  • Apache Commons CLI library v1.3.1

Afterwards copy&paste the HelloWorld code from above into the source folder. You might also find my semantic version parser class useful later on (not required here, though).

Compiling and dexing the Java class

Next step is to compile the java class (keep in mind that Android is stuck with Java 7 — bytecode for later versions won’t work). In case you are not used to doing this outside of an IDE, here’s the command:

javac -source 1.7 -target 1.7 -d bin -cp lib/commons-cli-1.3.1.jar src/com/example/HelloWorld.java

Make sure the program compiled properly:

java -cp lib/commons-cli-1.3.1.jar:bin com.example.HelloWorld -h usage: Hello world -h Print help -v Print version

Android cannot run Java class files directly. They have to be converted to Dalvik’s DEX format first (yes, even if you are using ART):

./android-sdk-linux/build-tools/23.0.2/dx --output=helloworld.jar --dex ./bin lib/commons-cli-1.3.1.jar

NOTE: Android Build Tools v28.0.2 and later contain a dx upgrade, called d8 . The d8 tool can process Java 8 class files. I’ll stick with dx for backwards compatibility reasons here.

Creating the startup shellscript

Android does not have a (normal) JRE, so JAR files cannot be started the same way as on a PC. You need a shellscript wrapper to do this. Copy&paste the one below to the workspace.

base=/data/local/tmp/helloworld export CLASSPATH=$base/helloworld.jar export ANDROID_DATA=$base mkdir -p $base/dalvik-cache exec app_process $base com.example.HelloWorld "$@"

NOTE: DEX files can also be started directly using the dalvikvm command, but going through app_process gives us a pre-warmed VM from the Zygote process (it is also the method employed by framework commands like pm and am ).

Installing and running the (non-) app

Time to push everything to the device:

adb shell mkdir -p /data/local/tmp/helloworld adb push helloworld.jar /data/local/tmp/helloworld adb push helloworld.sh /data/local/tmp/helloworld adb shell chmod 777 /data/local/tmp/helloworld/helloworld.sh

Moment of truth (fingers crossed):

adb shell /data/local/tmp/helloworld/helloworld.sh -v Hello World (armv7l) v0.1

NOTE: Since nothing was installed into the system, getting rid of the program is simply done by deleting the directory again.

It works, but how do I get a Context?!

Contexts represent an environment that is associated with an app (which we explicitly did not build) and are also device dependant. They can only be created by the ActivityThread class (a hidden system class that you cannot instantiate). If you want to interact with the Android runtime, you have to talk to the system services directly through their Binder interfaces. But that’s a topic for another article.

Follow up articles

Источник

Запускаем консольные Java приложения на Android

Речь пойдёт о проекте-утилитке, который может пригодиться всякому кто изучает Java и не всегда имеет под рукой ПК для просмотра работы примера кода в полевых условиях (как-то — в метро, маршрутке, кафешке и т.д.).

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

Ноутбука у меня нет, а запускать примеры кода на смартфоне, сидя на кухне за чашечкой чая, удобно.

Так уж повелось, что бо́льшая часть примеров для обучения обычно приводится именно в формате консольных программ. Замечательный инструмент AIDE позволяет собирать Android-приложение на основе Eclipse-проектов. Возможность, увы, недостаточная для запуска консольных примеров методом копипасты.

Дело за малым — перенаправляем потоки ввода/вывода в UI контролы:

 private static OutputStream mOutputStream = new OutputStream() < @Override public void write(int b) < MainActivity.getInstance().write((byte)b); >>; @Override public void onCreate(Bundle savedInstanceState)

Консольная программа стартует в отдельном потоке из обработчика activity onResume() :

 @Override public void run() < try < // // Здесь запускается консольное приложение // Program.main(new String[0]); >catch (Throwable ex) < // Тут же ловим все исключения setErrorColor(); ex.printStackTrace(); >> 

Здесь же можно задавать аргументы командной строки — старый добрый args . Пример — запуск BankTellerSimulation на 10 секунд:

BankTellerSimulation.main(new String[] < "10" >); 

Поддерживается работа нескольких потоков ( SimpleThreadsTest ):

HorseRace и BankTellerSimulation — примеры более сложных многопоточных приложений (взяты из книги Thinking in Java, 4th Ed by Bruce Eckel).

Ошибки времени выполнения
class FuuuuuuException extends RuntimeException < public FuuuuuuException(String message) < super(message); >> . throw new FuuuuuuException(". TROLLFACE. "); 

Ввод

Напоследок, для полноты возможностей, был добавлен консольный ввод. Пока что мои познания в области пользовательского интерфейса Android не велики. Кое-как впихнуть EditText удалось, но результат не идеален 🙂

Приглашение ввода строки ( ReadingInputTest ):

Функции меню

Exit выключает процесс через System.exit(0) .

Программа «одноразовая». Повторных перезапусков нет (не хотелось возиться с очисткой значений статических полей).

Что делает Clear — большой секрет.

Что не работает

• assert ‘ы Java. Т.е. оператор

исключение java.lang.AssertionError не кинет. Не путать с assert’ами JUnit — с ними всё в порядке!)
• Класс Console .
• Поле ввода не всегда подхватывает фокус.

Файлы проекта

Исходники можно забрать с GitHub, либо скачать zip-архив с проектами для Android Studio и Eclipse.

Описанные примеры находятся в пакете com.examples . Все примеры можно без изменений запускать на обычном ПК (run everywhere!).

Источник

Как установить Java на Android

wikiHow работает по принципу вики, а это значит, что многие наши статьи написаны несколькими авторами. При создании этой статьи над ее редактированием и улучшением работали авторы-волонтеры.

Количество просмотров этой статьи: 84 774.

Технически Java не поддерживается в Android [1] X Источник информации , то есть вы не сможете запускать JAR файлы или открывать веб-сайты с Java элементами. Но есть несколько способов обойти эти ограничения. Если вы хотите запускать JAR файлы на телефоне, вам потребуется доступ из-под рута, а затем установить эмулятор. Если вы хотите просматривать веб-сайты с Java элементами, вам нужно использовать удаленный рабочий стол для доступа к сайтам через настольный браузер.

Эмулятор Java

Изображение с названием Get Java on Android Step 1

  • Примечание: Java эмулятор не позволит вам просматривать веб-сайты с Java элементами, но позволит запускать JAR файлы. Если вы хотите просматривать веб-сайты, перейдите к следующему разделу.

Изображение с названием Get Java on Android Step 2

Изображение с названием Get Java on Android Step 3

  • Запустите APK файлы, чтобы установить приложения.
  • Скачайте JADGen на ваш компьютер и используйте эту программу, чтобы создать JAD файлы для любых JAR файлов, которые вы хотите запустить.
  • Скопируйте JAR и JAD файлы в одну папку на вашем устройстве. Убедитесь, что в имени JAR файла нет пробелов.
  • Запустите файл с помощью phoneMe.

Изображение с названием Get Java on Android Step 4

  • Вы можете переместить libjbedvm.so при помощи ADB и команды adb push / filelocation /libjbedvm.so /system/lib .
  • Скопируйте JAR файлы, которые вы хотите запустить, в отдельную папку на вашем телефоне.
  • Запустите Jbed и нажмите «Меню». Перейдите в папку с JAR файлами и выделите файл, который вы хотите запустить.

Изображение с названием Get Java on Android Step 5

  • ibDxDrmJava.so – /system/lib
  • libjbmidpdy.so – /system/lib
  • libjbmidp.so – /system/lib
  • javax.obex.jar – /system/framework
  • MetaMidpPlayer.apk – /system/app
  • MidpPlayer.apk – /system/app
  • Скопируйте JAR файлы, которые вы хотите запустить, в телефон. Используйте JBlend, чтобы выбрать и загрузить файлы.

Изображение с названием Get Java on Android Step 6

  • Конвертируйте JAR/JAD файлы в APK файлы с помощью конвертера на сайте Netmite.
  • Скопируйте полученный АРК файл в телефон и запустите его для установки. Повторите эту процедуру со всеми JAR файлами, которые вы хотите запустить.
  • Откройте Netmite в телефоне и используйте это приложение, чтобы выбрать любой из установленных JAR файлов.

Источник

Читайте также:  Java verify not null
Оцените статью