Что такое нативный код?
В переводе с английского Native = Родной. И смотря в каком контексте это встречается. Если например писать приложение на Flash под Android и iOS то это считается не нативное приложение. А если же писать два приложения. Одно на Android NDK для Android и iOS SDK для iOS то эти приложения можно счтитать нативными. Понятие нативный код — код который поставляется разработчиками чего-либо. Как например весь код в Java SDK под Android считается нативным. Все библиотеки третих разработчиков уже нет. Ну как то так 🙂
6 авг 2013 в 10:31
@fori1ton, спасибо. Вы мне открыли глаза 🙂 Стока времени заблуждений. Но в тоже время код можно считать нативным по отношению к виртуальной машине?
6 авг 2013 в 10:47
@Bimawa, обычно так не делают. Есть нативнй — исполняемый на процессоре, и ненативный — исполняемый в виртуальной машине. Разве что если на Java написать виртуальную машину и запускать в ней какой-то код, то это будет ненативный код для JVM, а код самой виртуальной машины можно будет считать нативным по отношению к JVM. Но это уже изврат.
6 авг 2013 в 10:53
@fori1ton, спасибо! @nMike и Вам тоже )
6 авг 2013 в 10:55
Если говорить о window (по крайней мере об NT платформе — 2000, xp, 7,8), то в этом случае .NET — никакой не нативный. Более того, приложения, которые используют win api — также не являются нативными. Нативные только те, которые используют специальное Native API.
6 авг 2013 в 11:18
5 ответов 5
Сортировка: Сброс на вариант по умолчанию
Понятие нативный код — код который поставляется разработчиками чего-либо. Как например весь код в Java SDK под Android считается нативным. Все библиотеки третих разработчиков уже нет.
Бред. Нативный код — код, компилируемый в машинные инструкции и выполняемый непоредственно процессором устройства. Любой код на Java не нативен по определению, так как выполняется на виртуальной машине. Нативный код могут писать как разработчики платформы, так и третьи разработчики (при помощи упомянутого Android NDK).
Отслеживать
ответ дан 6 авг 2013 в 10:41
23.4k 3 3 золотых знака 49 49 серебряных знаков 70 70 бронзовых знаков
@fori1ton, возможно я не до конца понял Ваш ответ, но IMHO утверждение Любой код на Java не нативен по определению, так как выполняется на виртуальной машине. несколько спорно, если вспомнить о такой полузабытой штуке, как PicoJava (аппаратная интерпретация Java байт-кода). — А по существу ответа, что нативным называется код, который исполняется аппаратно, я согласен (хотя иногда трудно провести границу между чистой аппаратурой, микропрограммами, гипервизором и эмуляцией некоторых команд системным ПО).
6 авг 2013 в 20:27
@avp: а ещё JIT-компиляция.
6 авг 2013 в 23:34
А учитывая, что современные процессоры умеют переставлять команды местами, более того, они транслируют инструкции в свое собственное внутреннее представление.
7 авг 2013 в 6:55
@KoVadim, да, и это очень напоминает JIT компиляцию, только не для байт-кода, а для машинных инструкций.
7 авг 2013 в 7:15
В одном слове «нативный» (от англ. native, «родной») недостаточно информации. Необходимо уточнение: родной для кого?
- Для JVM родной код — байт-код, родной язык — Java (и другие).
- Для Windows родной код — Portable Executable, родной язык — C++, Delphi и др.
- Для процессора x86 родной код — инструкции x86, язык — ассемблер.
и т.п. Многие современные приложения выполняются на «слоеном пироге» из платформ: например, написанное на Java приложение выполняется на JVM, которая в свою очередь может выполняться под (или над?) Windows, которая выполняется на процессоре x86. Каждый слой имеет свой нативный код. Код из другого слоя для него не будет нативным, например, для Windows Java-код ненативный.
Родной язык — язык, для которого есть компилятор в родной код (для данной платформы).
Отслеживать
ответ дан 7 ноя 2015 в 21:55
Sergey Slepov Sergey Slepov
490 3 3 серебряных знака 8 8 бронзовых знаков
Бредовый ответ. Это достаточно общеизвестное понятие, чтобы в нём было достаточно информации.
7 ноя 2015 в 22:38
@Qwertiy в целом верно, если убрать последний абзац
14 ноя 2017 в 10:08
@Qwertiy, можно конкретней, с чем именно вы несогласны?
14 ноя 2017 в 16:18
@rjhdby, перечитал последний абзац. Чем он вам не понравился?
14 ноя 2017 в 16:19
@SergeySlepov тем, что я с ним в корне не согласен
14 ноя 2017 в 16:49
Обратимся к Wiki
In computing, software or data formats that are native to a system are those that the system supports with minimal computational overhead and additional components. This word is used in such terms as native mode or native code.
Something running on a computer natively means that it is running without any external layer requiring fewer software layers. For example, in Microsoft Windows the Native API is an application programming interface specific for Windows NT kernel, which can be used to give access to some kernel functions, which cannot be directly accessed through a more universal Windows API.
Нативный для среды исполнения код/язык/АПИ/Формат данных и т.д. — это такой, который понимается средой исполнения по умолчанию, без сложных надстроек. Абсолютно четкого определения нет — есть некое «общепринятое» понимание, которое может разниться от человека к человеку.
Для Windows, например, нативным является исполняемый код в формате .exe (или .com ) файла, который работает непосредственно с Win API. Для Unix систем нативным являются бинарные файлы (а, так-же, shell-скрипты внезапно), для JVM нативным является .jar (не только) файл. Т.е. если совсем просто, то нативный код — это тот, который вы скормили установленной из коробки среде исполнения(дабл клик по .exe файлу в Windows) и он исполнился, не ругаясь, что ему не хватает библиотек или фреймворков.
Нативный язык — это это еще более обтекаемое определение. Можно, с оговорками, считать, что нативный для платформы язык — это язык, для которого производителем платформы создана среда разработки/компилятор в нативный код и о поддержке которого они официально заявляют в документации.
PS На ум пришла хорошая аналогия. Уровень знания иностранного языка определяется экзаменами по нему с выставлением оценки: A1,A2,B1,B2,C1,C2. Но есть и еще один уровень владения языком — native. Означает он что человек с детства живет в данной языковой среде, говорит на нем и думает(!) на нем. Уровень native не говорит о грамотности человека, зачастую native хуже знает правила языка, чаще ошибается в грамматике и пунктуации, чем С2, но он для него РОДНОЙ.
Как вызвать нативный код?
Нативным (или машинным) кодом называется скомпилированный бинарный код. В него компилируется, например, код на C++. Java приложение может работать на любой платформе именно потому, что оно не компилируется в бинарник – вместо этого его байткод выполняется на виртуальной машине. Но порой нужно обратиться к готовой программе на другом языке, или воспользоваться специальными возможностями ОС.
Если бинарный код поставляется в виде библиотеки (.dll в Windows, .so в Unix), у вас есть два варианта:
JNI (Java Native Interface) – стандартный фреймворк взаимодействия с бинарным кодом. С ним можно в Java исходнике объявить метод без тела, а реализацию брать из бинарного файла. Простой пример использования читайте на хабре.
JNA (Java Native Access) – сторонняя open-source библиотека, ставшая стандартом де-факто. Медленнее чем JNI, но гораздо проще в использовании. В отличие от JNI не требует кодогенерации и написания вспомогательной обвязки. Несколько примеров вызова из Java кода функций бинарных библиотек можно найти на википедии.
Когда нативный код исполняемый (.exe в Windows, файл с правом x в Unix), можно запустить его отдельным процессом, как было описано ранее. Но если вы разрабатываете этот бинарный код самостоятельно, то лучше сэкономить на создании отдельного процесса, и выбрать вариант сборки в библиотеку.
Нативный код
Машинный код (также употребляются термины собственный код, или платформенно-ориентированный код, или родной код, или нативный код — от англ. native code ) — система команд (язык) конкретной вычислительной машины (машинный язык), который интерпретируется непосредственно микропроцессором или микропрограммами данной вычислительной машины.
Каждая модель процессора имеет свой собственный машинный язык, хотя во многих моделях эти наборы команд сильно перекрываются. Говорят, что процессор A совместим с процессором B, если процессор A полностью «понимает» машинный код процессора B. Если процессор A знает несколько команд, которых не понимает процессор B, то B несовместим с A.
«Слова» машинного языка называются машинными инструкциями. Каждая из них описывает элементарное действие, выполняемое процессором, такое как «переслать байт из памяти в регистр». Программа — это просто длинный список инструкций, выполняемых процессором. Раньше процессоры просто выполняли инструкции одну за другой, но новые суперскалярные процессоры способны выполнять несколько инструкций за раз. Прямой поток выполнения команд может быть изменён инструкцией перехода, которая переносит выполнение на инструкцию с заданным адресом. Инструкция перехода может быть условной, выполняющей переход только при соблюдении некоторого условия.
Также инструкции бывают постоянной длины (у MISC-архитектур) и диапазонной (у x86 команда имеет длину от 8 до 120 битов).
См также
- Язык ассемблера
- Система команд
Wikimedia Foundation . 2010 .
- Нативное программное обеспечение
- Натиск на Восток
Полезное
Смотреть что такое «Нативный код» в других словарях:
- Исполняемый код — Эта статья о системе команд в целом; об инструкциях см.: Код операции (информатика). Машинный код (также употребляются термины собственный код, или платформенно ориентированный код, или родной код, или нативный код от англ. native code) система… … Википедия
- Платформенно-ориентированный код — Эта статья о системе команд в целом; об инструкциях см.: Код операции (информатика). Машинный код (также употребляются термины собственный код, или платформенно ориентированный код, или родной код, или нативный код от англ. native code) система… … Википедия
- Родной код — Эта статья о системе команд в целом; об инструкциях см.: Код операции (информатика). Машинный код (также употребляются термины собственный код, или платформенно ориентированный код, или родной код, или нативный код от англ. native code) система… … Википедия
- Сравнение языков программирования — Эту статью следует викифицировать. Пожалуйста, оформите её согласно правилам оформления статей. Условные обозначения … Википедия
- Интерпретируемый язык программирования — язык программирования, в котором исходный код программы не преобразовывается в машинный код для непосредственного выполнения центральным процессором (как в компилируемых языках), а исполняется с помощью специальной программы интерпретатора. В… … Википедия
- Машинная инструкция — Эта статья о системе команд в целом; об инструкциях см.: Код операции (информатика). Машинный код (также употребляются термины собственный код, или платформенно ориентированный код, или родной код, или нативный код от англ. native code) система… … Википедия
- Машинный язык — Эта статья о системе команд в целом; об инструкциях см.: Код операции (информатика). Машинный код (также употребляются термины собственный код, или платформенно ориентированный код, или родной код, или нативный код от англ. native code) система… … Википедия
- Мобильная игра — Часть серии … Википедия
- Игры для мобильных устройств — … Википедия
- OCaml — Objective Caml Семантика: мультипарадигменный: функциональный, объектно ориентированный, императивный Автор(ы): INRIA Релиз: 4.00.1 (5 октября … Википедия
- Обратная связь: Техподдержка, Реклама на сайте
- Путешествия
Экспорт словарей на сайты, сделанные на PHP,
WordPress, MODx.
- Пометить текст и поделитьсяИскать в этом же словареИскать синонимы
- Искать во всех словарях
- Искать в переводах
- Искать в ИнтернетеИскать в этой же категории
Нативный код во Flutter проекте
Всем привет! Меня зовут Влад и я iOS/Flutter-разработчик в DexSys на проекте Dexbee. В этой статье поделюсь своим опытом подключения нативного кода на мобильных платформах Android/iOS во Flutter проекте «DexBee Клуб».
DexBee — это система мотивации и повышения вовлеченности в занятия фитнесом, основанная на контроле нагрузки во время тренировки. А «DexBee Клуб» — приложение для управления клубной системой вовлечения клиентов в фитнес. Позволяет протестировать инфраструктуру в клубе на соответствие требованиям оборудования DexBee, а также запускать соревнования в клубе. Первый релиз приложения был в конце 2021 года, и работа над ним до сих пор продолжается.
В основном, когда вы пользуетесь Flutter, нативный код писать нет необходимости. Разработчиками этого фреймворка и просто крутыми энтузиастами сейчас написано множество библиотек, которые, в свою очередь, сами имеют пару-тройку вариаций. Да и пригождается он только в том случае, когда нужно обратиться к возможностям железа телефона, например к:
- датчикам, камере, аккумулятору, геолокации, звуку, подключению
- обмену информацией с другими приложениями, запуску других приложений
- сохраненным настройкам, специальным папкам, информации об устройстве и так далее
Но, как я написал ранее, всё это уже реализовано.
Второй случай, при котором нам все-таки надо писать нативный код, это необходимость в «нестандартной» фиче, которую мне и надо было реализовать.
По моему опыту, в жизни каждого разработчика наступает момент, когда вы связываетесь с китайцами и появляется задача включить в проект их самописный фреймворк. Естественно, он написан на нативных языках, Obj-C/Java.
Вкратце, основная задача:
Есть оборудование, которое клиенты должны суметь настроить, не устанавливая приложения поставщиков этого самого оборудования. Настройка происходит по Bluetooth, где, описывая каждую команду, на приём/отправку пакетов ушёл бы не один месяц. Поэтому, заботливые поставщики написали фреймворки-обёртки под мобильные платформы iOS и Android.
Но наш проект — на Flutter. Я думал, что придётся немного «попотеть», но, на деле, все оказалось намного проще, чем вспоминать свои навыки написания под Андроид трёхлетней давности.
Задача ясна, пора начинать делать
Стоит упомянуть, технологии мы стараемся держать самыми актуальными, поэтому Flutter версии 3.3.10. А описывать я буду задачу на передачу команды «Сканировать доступные для подключения WiFi сети» оборудованию DexBee.
На выход нам нужен список сетей для презентации пользователю. На основе этого списка пользователь будет решать: к какому WiFi необходимо подключить устройство. Код будет предоставлен на Flutter и Swift, чтобы не получить в свой адрес больших и малых лепёх от уважаемых андроид-разработчиков.
Итак, приступим
Для начала, нам необходимо найти нужный метод во фреймворке, какие параметры он получает на вход и что отдаёт на выходе. Подключаем фреймворк в автоматически созданные флаттером нативные проекты и изучаем.
Для получения ответа от устройства подписываемся на делегат HubConfig.
Находим нужный метод и описываем работу с ним.
Что мы имеем в результате: массив из Any. Это значит, что на выходе мы можем получить буквально что угодно.
Забыл упомянуть, что также у нас имеется документация по работе с фреймворком. на китайском. В современном мире это уже не такая большая проблема — словарь по китайскому языку покупать не пришлось. Воспользовавшись переводчиком, я узнал, что на выходе мы получаем словарь, где по ключу можно взять нужную мне информацию для отображения пользователю. Углубляться в это не буду, так как моя статья всё же о другом.
В результате поиска в документации мы получили объект WiFiHubModel, который хранит в себе одно значение — имя сети.
Теперь мы имеем всё необходимое для написания, собственно, кода на Flutter.
По порядку:
- Так как помимо нашей маленькой библиотечки есть ещё куча других библиотечек, которые также пользуются нативными фичами платформы, то нам необходимо создать канал с уникальным идентификатором, по которому и будет происходить «общение» флаттер кода с нативом. Уникальным же он должен быть для того, чтобы не отправить запрос в натив другой нашей библиотечке и не получить совершенно другие данные на выходе.
- По нашему каналу отправляем запрос в нативный код: выполнить операцию с названием scanWiFiHubList, ожидая на выходе словарь.
- И мапим словарь в нужный нам объект
Просто до невозможности. А ведь первой моей мыслью по этой задаче было — «сто пятьсот часов поди потребуется…».
Если копать чуть глубже, то общение по каналу происходит асинхронно по типу «отправил запрос – получил ответ», причём ответ точно должен быть хотя бы null. При вызове метода invokeMethod у MethodChannel идёт передача названия вызываемого метода платформы и его аргументы
Далее, эта информация преобразуется в бинарник и отсылается на платформу.
Канал платформы(MethodChannel) — это объект, который объединяет имя канала и кодек для сериализации/десериализации сообщений в двоичную форму и обратно.
Далее следует сам нативный код. На флаттере был открыт канал с идентификатором, надо на него подписаться. Чтобы разделить логику разных фич, создаём отдельный класс и в нём подписываемся на канал. Идентификатор должен соответствовать. А делаем мы это на инициализации приложения, то есть в AppDelegate.
Разберемся. При создании AppDelegate, мы также создаем объект HubMethodChannel и при запуске приложения вызываем у него метод handle. В handle создаем канал с тем же идентификатором, что и во флаттер, и подписываемся на обновления этого канала с помощью метода setMethodCallHandler. У нас только один метод и его название scanWiFiHubList, поэтому ждем его вызов и выполняем нужные нам действия.
В нем передаем замыкание с двумя параметрами: call и result. Call — объект, который приходит с флаттера, result — то, что должно вернуться во флаттер.
Что имеем в итоге:
- интуитивно понятная реализация фичи с необходимостью внедрения нативных фреймворков платформы
- довольные клиенты, которые теперь без постронней помощи могут настроить своё оборудование на работу с нашими сервисами
Flutter не ограничивает разработчиков на пользование фичами, поставляемыми операционной системой. Конечно, при релизе новой версии операционки нужно будет подождать, когда новоиспеченная фича появится и на флаттере. Но реализовать её так просто, что энтузиасты делают это чуть ли не в первую же неделю после релиза ОС.
А также могу посоветовать хорошую статью на Хабре о том, как это работает: https://habr.com/ru/articles/666272/
Автор: Влад, iOS/Flutter-разработчик DexSys