- Top 7 best Native App Example in 2022 that Merchants can learn from
- Native application in a nutshell
- What is Native App Development?
- Benefits of native applications
- Drawbacks of native apps
- Native mobile development tools
- Top 7 Native app example for the 2022 mobile app marketplace
- # Spotify
- # Magento 2 POS
- # Pokemon Go
- # Waze
- # Tesla
- # SoundCloud
- 9 Super Useful Tips to Improve Native Android App Development
- Understand your users
- Design user touchpoints
- Get batched feedback
- Введение в Android NDK
- Что такое Android NDK?
- Для чего используют NDK?
- Что такое JNI?
- Преимущества JNI
- Как устроен JNI
- Локальные и глобальные ссылки
- Обработка ошибок
- Примитивные типы JNI
- Ссылочные типы JNI
- Модифицированный UTF-8
- Функции JNI
- Пример использования функций JNI
- Потоки
- Первые шаги
- Android.mk
- Application.mk
- NDK-BUILDS
- Как собрать проект?
- Вызов нативных методов из Java кода
Top 7 best Native App Example in 2022 that Merchants can learn from
November 30, 2021
Building a mobile app has become a top priority for many businesses to win over customers. Among various options, native app development made a good choice thanks to the various benefits it offers. This article will shed light on this approach and draw up the native app example list for your consideration.
Table of Contents
Native application in a nutshell
It is advised to have some core knowledge about native app development in the first stage before jumping right into our native app example list. These pieces of information will lay the solid foundation for your consideration regarding which app development approach to adopt for your firm’s operation.
What is Native App Development?
In its simplest form, a native app is a mobile application built in a specific programming language for a particular mobile operating system (iOS or Android OS). This means that if a native application is in Android only, it won’t appear in the App Store or work on an iOS phone.
Native apps are developed and used within its ecosystem, following every technical guideline set by the OS. For example, a native app iOS is often written in Swift or Objective-C while a native app for Android phones uses Java code.
Normally, mobile apps are divided into two categories, namely native and hybrid applications. So what makes a native application different from a hybrid one in terms of underlying technology? As the name implies, hybrid apps are a combination of web-based apps and native mobile apps, and they are built by HTML, CSS, or JavaScript codes.
Benefits of native applications
- Deliver the highest performance as native apps are created and optimized for a specific platform.
- Interactive, high-performance user input/ output as users are allowed to match each app’s UI/UX to the selected platform conventions.
- Get full support from Google Play or App store and the overall app marketplace.
- Allow developers to access the full feature set of the specific operating system such as GPS, camera, microphone, and other hardware.
- Have fewer bugs during development due to the one single code base feature.
- A higher level of security and data protection as any native app must be censored by its respective OS before being released.
- Allow offline mode.
- Offer consistent look and feel as native apps are developed using native SDKs.
Drawbacks of native apps
- Require a high level of expertise: developers need to be insightful to work with different codebases for every platform they choose to build in.
- Cost more and take a longer time to be built. This is because most developers specialize in one code base, so to have a native app for Android and iOS at the same time, you need to hire two separate dev teams.
- Require frequent updates from the OS.
Native mobile development tools
A native development tool is a software framework that allows developers to create applications for a single particular system. Xcode, Android Studio, and React Native are excellent native app development frameworks that are all worth a look.
Xcode and Android Studio are both traditional native app builders. In detail, Xcode is created and developed by Apple, and programmers use this software package to write native apps for iOS. Meanwhile, Android Studio is a framework to serve the need for native app Android development. This tool sticks to the native SDK provided by Google.
If you want to reap the benefits of cross-platform development, you can choose React Native as a trusted alternative. Launched by Facebook, React Native is an open-source platform to build both native apps in Android and iOS. Other than that, it also helps e-shop owners to develop their apps. For example, you can use React Native to build a native app for Woocommerce.
Top 7 Native app example for the 2022 mobile app marketplace
It comes as no surprise that native apps account for a large number of mobile applications in the marketplace. Hence, our native app example list will cover a wide range of fields, from messaging services, games, navigation programs to business applications for your consideration.
Developed as a native app for iOs and Android phones, WhatsApp is a commonly-used messaging service in many parts of the world. Noticeably, this platform was the fourth-most downloaded app globally in Q3 2020, with around 140 million times. Thus, this native app example is a potential option regarding business communication tools in the workplace.
Features:
- Voice/ video calls, voice messaging.
- Offer group function, with up to 8 participants per call.
- Ensure secure messaging with an end-to-end encryption.
- Allow media sharing, including photos, videos, and documents.
- Enable an advanced search feature.
# Spotify
Spotify – a well-liked native app example – claims itself among the must-have applications to be installed on the smartphones of music lovers. By way of explanation, it is a digital music service hub that gives users access to thousands of songs and podcasts from record labels and media companies universally. Other than it, Spotify is also one of the most prominent cloud-native application examples. Thanks to Google Cloud, Spotify has unlocked significant performance efficiency in its workloads to better serve the users.
Features:
- Develop a library as storage of downloaded songs/ podcasts.
- Integrate Spotify Radio.
- Offer the following mode in which users can follow their favorite artists and friends.
- Sort and filter support.
# Magento 2 POS
The Magento 2 POS (Point Of Sale) is a prime React Native application example in the field of eCommerce business. In particular, it allows proficient management of multiple physical stores just with a single application on their Android or iOS devices. Moreover, this Magento 2 React Native app will provide your cashiers with a user-friendly experience as they can handle the application on their tablets without any hassle.
Features
- Offer offline mode.
- Allow users to record customer data.
- Support inflow and outflow checking of every cash transaction.
- Allow sales agent to generate the credit memo for the returns.
# Pokemon Go
Pokemon Go is an AR mobile game that was awarded the App Store’s breakout hit of 2016. Specifically, the game dramatically simplifies the gameplay arena by turning the real world into a game map and making players the controller. With players going out to catch the balls, the idea of this native app example is to encourage people to travel around the real world.
Features:
- Allow access to GPS.
- Integrate AR technology.
- Available in 114 countries.
# Waze
Waze is a GPS navigation software that gains positive feedback from drivers around the world. This native app example works on smartphones and tablets with GPS support. In particular, the app helps users navigate by providing turn-by-turn information, route details, and user-submitted travel times. Another plus of Waze is that this application is totally free to download and use.
Features:
- Generate accurate incident and traffic data
- Integration with Google Assistant
- Allow user’s customization with items appearing on the map
- Allow users to schedule and take note of their drives
# Tesla
Tesla, the biggest name in the electrical motor industry, is also another one popular in the list of native app examples. The Tesla smartphone application allows its customers to remotely operate their vehicles. With the Tesla app, you can keep track of how fast your car is charging and even start and stop it. In terms of design, it looks and feels like a game thanks to the gloomy theme. The app is available on both the Google Play Store and the Apple App Store.
Features:
- Checking charging time
- Checking car heating/cooling
- Locking/unlocking
- Diagnosing
# SoundCloud
SoundCloud Pulse is a React Native app that lets creators manage accounts and engage with their communities. SoundCloud encountered a lot of problems during the development process. Specifically, the team couldn’t locate iOS developers. Consequently, the business opted to try React Native. Soon enough, they learned that React Native was indeed the best choice. Also simple was the fact that the React Native testing environments appeared and behaved quite similarly to the native ones, making comparisons between the two unnecessary. Most significantly, SoundCloud was now able to expand its infrastructure by including new web libraries.
Features:
- Allows you to create your own playlists.
- Automatically find similar audio recordings and stream them.
- Allowed to play it only on the home page.
- Give Access to Millions of Songs, Online & Offline
- Share their playlist with their friends, family members, and colleagues.
9 Super Useful Tips to Improve Native Android App Development
It takes a lot of time and effort to create a native app from scratch. They require the use of specialized languages, tools, and architecture configurations that depart from standard web conventions. For project managers, they demand a new way of thinking, more from the standpoint of development and design.
Understand your users
This may seem simple, but we see it overlooked far too frequently by app developers owing to a lack of time or impatience: you must get people to test your app before going live. These cannot be individuals who were engaged in any manner with the product’s conception or development. So, what exactly are you planning on putting to the test? How well people are navigating your app, if it is easy enough and does not cause them aggravation, are all important considerations. The MVP development process is one method of testing and gathering feedback.
Most apps no longer need users to register in the initial step. Passing this stage forces significant bounce rates. Asking for personal or credit card information before using the software will remove any potential obstacles.
If any of these features are required by your application, that is great; but, be sure that customers already enjoy your app before asking them to commit and place their faith in you.
Design user touchpoints
Contemplate various scenarios in which the user might wish to utilize your app and build your app accordingly. Push notifications are a fantastic tool that you should be exploring from a technological viewpoint.
Push notifications, on the other hand, when used effectively, may draw users back into a product at precisely the time when they are most in need of its services.
Get batched feedback
Developing native applications can be difficult, especially when working with a complex client API, as is frequently the case.
Your best chance is to emphasize during the early stages of project planning how critical it is to have a single voice that can synthesize feedback from different parties inside their company and suss out discrepancies with an eye toward the product’s aim.
Make it clear that it is your main point of contact’s responsibility to be that person, and emphasize how maintaining that pattern will boost productivity and streamline communication.
The Final Thoughts
This is all about native app development that we’d like to share with you today. Hope this blog will help you have a clear perception about native application mobile and better visualize how it works with our native app example list!
Still, if you have any questions or want some consultation for your Magento 2 native app idea, take a look at our Mininest module which is a free mobile app builder that allows you to easily convert your whole eCommerce website into a completely native mobile application. Mininest is used in conjunction with Flutter, Google’s mobile UI framework that allows developers to create high-quality native interfaces for iOS and Android in record time. Contact us to get more information and discount for this module
Источник
Введение в Android NDK
Для разработки приложений под ОС Android, Google предоставляет два пакета разработки: SDK и NDK. Про SDK существует много статей, книжек, а так же хорошие guidelines от Google. Но про NDK даже сам Google мало что пишет. А из стоящих книг я бы выделил только одну, Cinar O. — Pro Android C++ with the NDK – 2012.
Эта статья ориентирована на тех, кто ещё не знаком (или мало знаком) с Android NDK и хотел бы укрепить свои знания. Внимание я уделю JNI, так как мне кажется начинать нужно именно с этого интерфейса. Так же, в конце рассмотрим небольшой пример с двумя функциями записи и чтения файла. Кто не любит много текста, тот может посмотреть видео версию.
Что такое Android NDK?
Android NDK (native development kit) – это набор инструментов, которые позволяют реализовать часть вашего приложения используя такие языки как С/С++.
Для чего используют NDK?
Google рекомендует прибегать к использованию NDK только в редчайших случаях. Зачастую это такие случаи:
- Нужно увеличить производительность (например, сортировка большого объема данных);
- Использовать стороннюю библиотеку. Например, много уже чего написано на С/С++ языках и нужно просто заиспользовать существующий материал. Пример таких библиотек, как, Ffmpeg, OpenCV;
- Программирование на низком уровне (например, всё что выходит за рамки Dalvik);
Что такое JNI?
Java Native Interface – стандартный механизм для запуска кода, под управлением виртуальной машины Java, который написан на языках С/С++ или Assembler, и скомпонован в виде динамических библиотек, позволяет не использовать статическое связывание. Это даёт возможность вызова функции С/С++ из программы на Java, и наоборот.
Преимущества JNI
Основное преимущество перед аналогами (Netscape Java Runtime Interface или Microsoft’s Raw Native Interface and COM/Java Interface) является то что JNI изначально разрабатывался для обеспечения двоичной совместимости, для совместимости приложений, написанных на JNI, для любых виртуальных машин Java на конкретной платформе (когда я говорю о JNI, то я не привязываюсь к Dalvik машине, потому как JNI был написан Oracle для JVM который подходит для всех Java виртуальных машин). Поэтому скомпилированный код на С/С++ будет выполнятся в не зависимости от платформы. Более ранние версии не позволяли реализовывать двоичную совместимость.
Двоичная совместимость или же бинарная совместимость – вид совместимости программ, позволяющий программе работать в различных средах без изменения её исполняемых файлов.
Как устроен JNI
JNI таблица, организована как таблица виртуальных функций в С++. VM может работать с несколькими такими таблицами. Например, одна будет для отладки, вторая для использования. Указатель на JNI интерфейс действителен только в текущем потоке. Это значит, что указатель не может гулять с одного потока в другой. Но нативные методы могут быть вызваны из разных потоков. Пример:
- *env – указатель на интерфейс;
- оbj – ссылка на объект в котором описан нативный метод;
- i and s – передаваемые аргументы;
Примитивные типы копируются между VM и нативным кодом, а объекты передаются по ссылке. VM обязана отслеживать все ссылки которые передаются в нативный код. Все переданные ссылки в нативный код не могут быть освобождены GC. Но нативный код в свою очередь должен информировать VM о том что ему больше не нужны ссылки на переданные объекты.
Локальные и глобальные ссылки
JNI делит ссылки на три типа: локальные, глобальные и слабые глобальные ссылки. Локальные действительны пока не завершиться метод. Все Java объекты которые возвращает функции JNI являются локальными. Программист должен надеется на то что VM сама подчистит все локальные ссылки. Локальные ссылки доступны лишь в том потоке в котором были созданы. Однако если есть необходимость то их можно освобождать сразу методом JNI интерфейса DeleteLocalRef:
Глобальные ссылки остаются пока они явно не будут освобождены. Что бы зарегистрировать глобальную ссылку следует вызвать метод NewGlobalRef. Если же глобальная ссылка уже не нужна, то её можно удалить методом DeleteGlobalRef:
Обработка ошибок
JNI не проверяет ошибки такие как NullPointerException, IllegalArgumentException. Причины:
- снижение производительности;
- в большинстве функций C библиотек очень и очень трудно защитится от ошибок.
JNI позволяет использовать Java Exception. Большинство JNI функций возвращают код ошибок а не сам Exception, и поэтому приходится обрабатывать сам код, а в Java уже выбрасывать Exception. В JNI следует проверять код ошибки вызываемых функций и после них следует вызвать ExceptionOccurred(), которая в свою очередь возвращает объект ошибки:
Например, некоторые функции JNI доступа к массивам не возвращают ошибки, но могут вызвать исключения ArrayIndexOutOfBoundsException или ArrayStoreException.
Примитивные типы JNI
В JNI существуют свои примитивные и ссылочные типы данных.
Java Type | Native Type | Description |
---|---|---|
boolean | jboolean | unsigned 8 bits |
byte | jbyte | signed 8 bits |
char | jchar | unsigned 16 bits |
short | jshort | signed 16 bits |
int | jint | signed 32 bits |
long | jlong | signed 64 bits |
float | jfloat | 32 bits |
double | jdouble | 64 bits |
void | void | N/A |
Ссылочные типы JNI
Модифицированный UTF-8
JNI использует модифицированную кодировку UTF-8 для представления строк. Java в свою очередь использует UTF-16. UTF-8 в основном используется в С, потому что он кодирует \u0000 в 0xc0, вместо привычной 0x00. Изменённые строки кодируются так, что последовательность символов, которые содержат только ненулевой ASCII символы могут быть представлены с использованием только одного байта.
Функции JNI
Интерфейс JNI содержит в себе не только собственный набор данных, но и свои собственные функции. На их рассмотрение уйдёт много времени, так как их не один десяток. Ознакомится с ними вы сможете в официальной документации.
Пример использования функций JNI
Небольшой пример, что бы вы усвоили пройденный материал:
Разберём построчно:
- JavaVM – предоставляет интерфейс для вызова функций, которые позволяют создавать и уничтожать JavaVM;
- JNIEnv – обеспечивает большинство функций JNI;
- JavaVMInitArgs – аргументы для JavaVM;
- JavaVMOption – опции для JavaVM;
Метод JNI_CreateJavaVM() инициализирует JavaVM и возвращает на неё указатель. Метод JNI_DestroyJavaVM() выгружает созданную JavaVM.
Потоки
Всеми потоками в Linux управляет ядро, но они могут быть прикреплены к JavaVM функциями AttachCurrentThread и AttachCurrentThreadAsDaemon. Пока поток не присоединён он не имеет доступа к JNIEnv. Важно, Android не приостанавливает потоки которые были созданы JNI, даже если срабатывает GC. Но перед тем как поток завершиться он должен вызвать метод DetachCurrentThread что бы отсоединиться от JavaVM.
Первые шаги
Структура проекта у вас должна выглядеть следующим образом:
Как мы видим из рисунка 3, весь нативный код находится в папке jni. После сборки проекта, в папке libs создастся четыре папки под каждую архитектуру процессора, в которой будет лежать ваша нативная библиотека (количество папок зависит от количество выбранных архитектур).
Для того, чтобы создать нативный проект, нужно создать обычный Android проект и проделать следующие шаги:
- В корне проекта нужно создать папку jni, в которую поместить исходники нативного кода;
- Создать файл Android.mk, который будет собирать проект;
- Создать файл Application.mk, в котором описываются детали сборки. Он не является обязательным условием, но позволяет гибко настроить сборку;
- Создать файл ndk-build, который будет запускать процесс сборки (тоже не является обязательным).
Android.mk
Как упоминалось уже выше, это make файл для сборки нативного проекта. Android.mk позволяет группировать ваш код в модули. Модули могут быть как статические библиотеки (static library, только они будут скопированные в ваш проект, в папку libs), разделяемые библиотеки (shared library), автономный исполняемый файл (standalone executable).
Пример минимальной конфигурации:
Рассмотрим детально:
- LOCAL_PATH := $(call my-dir) – функция call my-dir возвращает путь папки в которой вызывается файл;
- include $(CLEAR_VARS) – очищает переменные которые использовались до этого кроме LOCAL_PATH. Это необходимо так как все переменные являются глобальными, потому что сборка происходит в контексте одного GNU Make;
- LOCAL_MODULE – имя выходного модуля. В нашем примере имя выходной библиотеки установлено как NDKBegining, но после сборки в папке libs создадутся библиотеки с именами libNDKBegining. Android добавляет к названию префикс lib, но в java коде при подключении вы должны указывать название библиотеки без префикса (то есть названия должны совпадать с установленными в make файлах);
- LOCAL_SRC_FILES – перечисление исходных файлов из которых следует создать сборку;
- include $(BUILD_SHARED_LIBRARY) – указывает тип выходного модуля.
В Android.mk можно определить свои переменные, но они не должны иметь такой синтаксис: LOCAL_, PRIVATE_, NDK_, APP_, my-dir. Google, рекомендует называть свои переменные, как MY_. Например:
Application.mk
NDK-BUILDS
Ndk-build из себя представляет обёртку GNU Make. После 4-й версии ввели флаги для ndk-build:
- clean – очищает все сгенеренные бинарные файлы;
- NDK_DEBUG=1 – генерирует отладочный код;
- NDK_LOG=1 – показывает лог сообщений (используется для отладки);
- NDK_HOST_32BIT=1 – Android имеет средства для поддержки 64-х битных версий утилит (например NDK_PATH\toolchains\mipsel-linux-android-4.8\prebuilt\windows-x86_64 и т.д.);
- NDK_APPLICATION_MK — указывается путь к Application.mk.
В 5-й версии NDK был введён такой флаг как NDK_DEBUG. Если он установлен в 1 то создаётся отладочная версия. Если флаг не установлен то ndk-build по умолчанию проверяет стоит ли атрибут android:debuggable=«true» в AndroidManifest.xml. Если вы используете ndk выше 8-й версии, то Google не рекомендует использовать атрибут android:debuggable в AndroidManifest.xml (потому что если вы используете «ant debug» или строите отладочную версию с помощью ADT плагина то они автоматически добавляют флаг NDK_DEBUG=1).
По умолчанию устанавливается поддержка 64-х разрядной версии утилит, но вы можете принудительно собрать только для 32-х установив флаг NDK_HOST_32BIT=1. Google, рекомендует всё же использовать 64-х разрядность утилит для повышения производительности больших программ.
Как собрать проект?
Раньше это было мучением. Нужно было установить CDT плагин, скачать компилятор cygwin или mingw. Скачать Android NDK. Подключить это всё в настройках Eclipse. И как на зло это всё оказывалось не рабочим. Я первый раз когда столкнулся с Android NDK, то настраивал это всё 3 дня (а проблема оказалось в том что в cygwin нужно было дать разрешение 777 на папку проекта).
Сейчас с этим всё намного проще. Идёте по этой ссылке. Качаете Eclipse ADT Bundle в котором уже есть всё то что необходимо для сборки.
Вызов нативных методов из Java кода
Для того что бы использовать нативный код из Java вам сперва следует определить нативные методы в Java классе. Например:
Перед методом следует поставить зарезервированное слово «native». Таким образом компилятор знает, что это точка входа в JNI. Эти методы нам нужно реализовать в С/С++ файле. Так же Google рекомендует начинать именовать методы со слова nativeХ, где Х – реальное название метода. Но перед тем как реализовывать эти методы вручную, следует сгенерировать header файл. Это можно сделать вручную, но можно использовать утилиту javah, которая находится в jdk. Но пойдём дальше и не будет использовать её через консоль, а будем это делать при помощи стандартных средств Eclipse.
Теперь можете запускать. В директории bin/classes будут лежать ваши header файлы.
Далее копируем эти файлы в jni директорию нашего нативного проекта. Вызываем контекстное меню проекта и выбираем пункт Android Tools – Add Native Library. Это позволит нам использовать jni.h функции. Дальше вы уже можете создавать cpp файл (иногда Eclipse его создаёт по умолчанию) и писать тела методов, которые уже описаны в header файле.
Пример кода я не стал добавлять в статью, чтобы не растягивать её. Пример вы можете посмотреть/скачать с github.
Источник