Android NDK (комментарии)
Это сообщение сгенерировано автоматически.
«Хотя это и позволяет писать нативные приложения, работающие быстрее чем Java, писать только на C/C++ нельзя, точка входа обязательно должна быть написана на Java», — это не правда. Полностью нативные андроид-приложения можно делать чуть ли не со времён 9-й версии API (android 2.3). Proof: https://developer.android.com/ndk/samples/sample_na
https://github.com/android/ndk-samples/tree/main/native-activity — исходники минимального примера.
General GDA
Пофиксил
Я бы ещё текст прогнал через спелл чекер (пунктуация, опечатки) и согласовал предложение. А то «это ...» и начинается с маленькой буквы, и читается как-то не очень. Но это мелочи.
Главное, что «работающие быстрее, чем Java», — это субъективное оценочное суждение. Мало того, что на android нету Java (да, программу на этом языке можно скомпилировать для работы на Android; но на устройствах нет Java VM, модель памяти отличается от Java и т.п.). Так ещё на C/C++ надо постараться написать быстрее. К примеру, в современных андроидах очень сложная среда исполнения, где есть пред-компиляция в нативный код ещё на момент инсталляции приложения. При обновлении ОС может (и делает) перекомпиляция такого кода. Ещё пример: лично я при должном старании определённый класс задач под андроид вполне могу написать на Java/Kotlin так, что будет быстрее, чем на C++. Как в плане скорости выполнения кода, так и в плане скорости его написания.
Раз форум у нас тут гемдеву посвящён. То я могу набросить пример: на Unity так вообще всё на C# пишется. И ничего. Тонны успешных проектов (гемдев проектов!) под мобильные телефоны.
Если и писать про «быстрее», то со ссылками на конкретные исследования или case studies.
General GDA, хотелось бы поподробнее, как вы напишите приложение, которое написано на Java так, чтобы оно работало быстрее внутреннего цикла нативной программы? В плане скорости работы кода.
Про скорость написания - это зависит от того, что уже для этого сделано.
Mirrel
ну, как пример из головы - если работа приложения состоит в обработке строк или структур, которые оно получает с помощью одних вызовов API и отображает с помощью других, то большую часть времени нативное приложение может заниматься перепаковыванием их в свое представление, а java - будет работать с данными "как есть".
Другой пример - оптимизатор java вполне может быть круче оптимизатора fpc и соответственно одни и те же вычисления будут преобразованы в более эффективный машинный код.
kipar, я не об этом спрашивал!
Есть (у абсолютно нативного приложения) свой внутренний цикл (как и в других системах). Из этого цикла и происходят всё вызовы этого самого приложения (Start, Stop, Pause, Resume ...).
Как, человек сможет, используя java-код, обойти скорость работы внутреннего цикла?
И, всеми данными, можно пользоваться из нативного кода. В дополнению к этому, многие данные на Android находятся именно в нативном виде, а внутренние библиотеки соединяют этот код для удобства работы с Java-кодом.
но это больше для информации.
Mirrel
> Start, Stop, Pause, Resume
эти операции делаются достаточно редко, чтобы игнорировать JNI-оверхед при их вызове. Да даже если Update - один JNI-вызов каждый кадр - это копейки.
Что если, я скажу, что можно полностью игнорировать JNI-вызовы?
Mirrel
> Что если, я скажу, что можно полностью игнорировать JNI-вызовы?
и писать при этом на яве?
Зачем? Лично я буду писать на Паскале. Другой народ на C/C++. Кто умеет, тот на каком ещё языке, кроме всех вышеперечисленных.
General GDA
То есть dalvik и art не выполняют (свой) java байт-код? Про скорость C/C++ согласен.
оффтоп: как цитаты писать?
egoros7
Dalvik, вроде как - вполне себе jvm и исполняет байткод. Хотя и не совсем compliant. А art - он AOT.
kkolyan
>а art - он AOT
Ну при включении машинный код всё же компилируется из байт-кода. Или я не прав?
egoros7
Скорее всего да, т.к. это проще чем компилить из сорцов. Но я наверняка не знаю.
Тема в архиве.