Загрузить
Загрузить
Введение
ZeroMQ — библиотека с открытым исходным кодом, широко используемая программистами во всем мире. Вот ее определение из Википедии: «ZeroMQ (также используется написание ØMQ, 0MQ или ZMQ) — высокопроизводительная библиотека для асинхронной обработки сообщений, предназначенная для использования в масштабируемых распределенных приложениях и параллельных приложениях. Эта библиотека реализует очередь сообщений, но в отличие от промежуточного ПО, ориентированного на сообщения, система с ZeroMQ может работать без выделенного брокера сообщений. Библиотека поддерживает удобный API в стиле socket».
На веб-сайте ZeroMQ сообществом предоставлены инструкции по сборке для платформы Android (http://zeromq.org/build:android). Однако эти инструкции предназначены для архитектуры ARM *,и разработчики столкнутся с ошибкой сборки, если попробуют собрать версию ZeroMQ для архитектуры x86, следуя данной пошаговой инструкции. Именно поэтому и была написана эта статья.
Подготовка среды сборки
При сборке ZeroMQ прежде всего необходимо создать отдельную цепочку инструментов для x86 на основе Android NDK.
- Загрузите и установите последнюю версию Android NDK: http://developer.android.com/tools/sdk/ndk/index.html. В этой статье мы используем android-ndk-r10d-linux-x86_64.
- Устраните известную проблему в make-standalone-toolchain.sh, применив исправление, описанное по адресу https://code.google.com/p/android/issues/detail?id=74145. Без этого исправления на следующем этапе сборки возникнет ошибка.
- Создайте отдельную цепочку инструментов для платформы Android x86.
./home/xxx/android-ndk-r10c/build/tools/make-standalone-toolchain.sh --arch=x86 --toolchain=x86-4.9 --install-dir=/home/xxx/android-standalone-toolchain-x86
Во избежание неполадок при сборке выполните две следующие рекомендации:
- создайте единую цепочку инструментов x86 в отдельной папке. Не размещайте цепочки инструментов x86 и ARM вместе в одной папке;
- установите отдельную цепочку инструментов в папку /home во избежание неполадок, связанных с наличием или отсутствием рутового доступа.
- Настройте переменные среды.
export PATH=/home/xxx/android-standalone-toolchain-x86/bin:$PATH export OUTPUT_DIR=/home/xxx/tmp/zeromq-android
Соберите ZeroMQ для Android x86
Ниже показано, как собрать ZeroMQ вместе с Jzmq и JAR для прямого использования в Android и загрузки в APK-файл.
- Загрузите исходный код и соберите ZeroMQ 3.x
mkdir /home/xxx/tmp cd /home/xxx/tmp git clone https://github.com/zeromq/zeromq3-x.git cd zeromq3-x/ ./autogen.sh ./configure --host=i686-linux-android --prefix=$OUTPUT_DIR LDFLAGS="-L$OUTPUT_DIR/lib" CPPFLAGS="-fPIC -I$OUTPUT_DIR/include" --enable-static --disable-shared LIBS="-lgcc" make make install
- Загрузите исходный код и соберите jzmq.
cd /home/xxx/tmp git clone https://github.com/zeromq/jzmq.git cd jzmq/ ./autogen.sh ./configure --host=i686-linux-android --prefix=$OUTPUT_DIR LDFLAGS="-L$OUTPUT_DIR/lib" CPPFLAGS="-fPIC -I$OUTPUT_DIR/include" --disable-version --with-zeromq=$OUTPUT_DIR LIBS="-lpthread -lrt" make make install
- Если при выполнении ./configure появится ошибка, удалите LIBS="-lpthread –lrt"и повторите попытку.
- Скопируйте файлы libjzmq.so и zmq.jar в нужную папку. Библиотека ZeroMQ
успешно собрана!cp /home/xxx/tmp/zeromq-android/lib/libjzmq.so /home/xx/tmp/ cp /home/xxx/tmp/zeromq-android/share/java/zmq.jar /home/xx/tmp/
Пример использования ZeroMQ на платформе Android x86
Теперь можно использовать ZeroMQ в приложениях для Android. Ниже приводится пошаговый пример использования ZeroMQ для реализации обмена сообщениями между клиентом ZeroMQ и сервером ZeroMQ. Часть этого кода взята из официального руководства ZeroMQ и помещена в проект Android.
- Скопируйте файл libjzmq.so в папку DemoJZMQ /jni/, скопируйте файл zmq.jar в папку DemoJZMQ /libs/.
- Добавьте приведенный ниже сценарий в файл Android.mk.
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := libjzmq LOCAL_SRC_FILES := libjzmq.so include $(PREBUILT_SHARED_LIBRARY)
- Добавьте приведенный ниже сценарий в файл Application.mk.
APP_ABI := x86
- Реализуйте функцию на стороне сервера.
public void startZMQserver() throws Exception { ZMQ.Context context = ZMQ.context(1); // Socket to talk to clients responder = context.socket(ZMQ.REP); responder.bind("tcp://*:" + SERVER_PORT); printLog("Server", "Started"); while (!Thread.currentThread().isInterrupted()) { // Wait for next request from the client byte[] request = responder.recv(0); printLog("Server", "Received:" + new String(request)); // Do some 'work' Thread.sleep(1000); // Send reply back to client String reply = "World"; responder.send(reply.getBytes(), 0); printLog("Server", "Response send."); } responder.close(); context.term(); }
- Реализуйте функцию на стороне клиента..
public void startZMQclient() throws Exception { ZMQ.Context context = ZMQ.context(1); // Socket to talk to server printLog("Client", "Connecting to ZMQ server…"); requester = context.socket(ZMQ.REQ); requester.connect("tcp://" + SERVER_IP + ":" + SERVER_PORT); printLog("Client", "Connected to server."); for (int requestNbr = 0; requestNbr != 10; requestNbr++) { String request = "Hello"; printLog("Client", "Sending Hello " + requestNbr); requester.send(request.getBytes(), 0); byte[] reply = requester.recv(0); printLog("Client", "Received " + new String(reply) + "" + requestNbr); } requester.close(); context.term(); }
- Запустите пример приложения на устройстве, сначала нажмите кнопку start server, а затем кнопку start client. В adb logcat видны результаты выполнения (рис. 1): когда клиент отправляет Hello на сервер, сервер в ответ 10 раз отправляет World клиенту.
Рисунок 1. Экран запуска демонстрационной программы JZMQ с образцом файла журнала
Заключение
В этой статье содержится пошаговая инструкция по компиляции библиотеки ZeroMQ для платформы Android x86. Также предоставляется простой пример использования передачи сообщений для демонстрации применения ZeroMQ в приложениях Android. Как было упомянуто выше, для успешной компиляции ZeroMQ для x86 важно создать правильные отдельные цепочки инструментов для x86 на основе Android NDK. Описываемый метод может быть полезен не только для ZeroMQ, но и для сборки других библиотек сторонних разработчиков.
Ссылки
- ØMQ - http://en.wikipedia.org/wiki/%C3%98MQ
- ZeroMQ build for Android - http://zeromq.org/build:android
- ØMQ - The Guide - http://zguide.zeromq.org/page:all
Об авторе
Бин Чжу (Bin Zhu) — инженер по разработке приложений в команде Intel® Atom™ Processor Mobile Enabling Team в подразделении Developer Relations Division отдела Software and Solutions Group (SSG). Он отвечает за поддержку приложений Android на процессорах Intel Atom, а также занимается технологиями мультимедиа на платформах Android x86.