Quantcast
Channel: 英特尔开发人员专区文章
Viewing all articles
Browse latest Browse all 583

为基于英特尔® x86 平台的安卓*应用编译ZeroMQ库文件

$
0
0

下载Compiling ZeroMQ library for Android x86 Platform.pdf

简介

ZeroMQ 是一种被全球编程人员广泛采用的开源函数库。 在维基百科中,其定义为: “ZeroMQ(也可拼写为 ØMQ、0MQ 或 ZMQ)是一种高性能异步信息传输 函数库,使用对象为可扩展分布式或并发应用。 它提供消息队列,但与面向消息的中间 件不同,ZeroMQ 系统能够在没有专用消息代理的情况下运行。 该函数库可提供熟悉的插 槽式 API。”

在 ZeroMQ 网站,社区为 Android 平台提供了构建指令 (http://zeromq.org/build:android)。 然而,这些指令以 ARM* 架构为主,因此,当开发人员尝试通过下列说明逐步构建 x86 版 ZeroMQ 函数库时,会遇到构建故障问题。 这就是本文撰写的原因所在。

构建环境准备

构建 ZeroMQ 的首要目的是为依赖 Android NDK 的 x86 创建独立的单机版工具链。

  1. 下载并安装最新版 Android NDK:
    http://developer. android.com/tools/sdk/ndk/index.html。 在本文中,我们使用 android-ndk- r10d-linux-x86_64。
  2. make-standalone-toolchain.sh 中的已知问题可以通过 https://code.google.com/p/android/issues/detail?id=74145.中提到 的补丁加以修复。 如果不使用该补丁,下一步中的构建将无法进行。
  3. 生成面向 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

    您可以采纳下列两点建议避免出现意外的构建问题。
     
    1. 在单独目录中生成一个 x86 工具链。 不要将 x86 工具 链和 ARM 工具链混合在一个目录中。
    2. 在您的 /home 目录中安装单机版工具链,以便避免 root/no-root 授权问题。
  4. 配置环境变量。

    export PATH=/home/xxx/android-standalone-toolchain-x86/bin:$PATH export OUTPUT_DIR=/home/xxx/tmp/zeromq-android
     

构建面向 Android x86 的 ZeroMQ

下列步骤将引导您构建 ZeroMQ,以及 Jzmq 及其相邻 JAR,以便直接在 Android  中使用并加载至 APK 文件。

  1. 下载源代码并构建 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
  2. 下载源代码并构建 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"并重新尝试。
  3. 将 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/

Android x86 中 ZeroMQ 的使用示例

现在,您可以在 Android 应用中使用 ZeroMQ 了。 下面我们举例说明如何使用 ZeroMQ 执行 ZeroMQ 客户端与 ZeroMQ 服务器之间的消息互动。 部分示例代码来自于 ZeroMQ 官方指南,并打包至 Android 项目。

  1. 将 libjzmq.so 拷贝至目录 “DemoJZMQ/jni/”,并将 zmq.jar 拷贝至目录 “DemoJZMQ/libs/”。
  2. 将下列脚本添加至 Android.mk
    LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := libjzmq LOCAL_SRC_FILES := libjzmq.so include $(PREBUILT_SHARED_LIBRARY)
  3. 将下列脚本添加至 Application.mk。
    APP_ABI := x86
  4. 执行服务器端函数。
     
     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();
     }

     
  5. 执行客户端函数。
     
     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();
     }

     
  6. 在设备上运行示例应用,首先点击 “start server” 按钮,然 后点击 “start client”。 您可以通过 “adb logcat” 查看执 行结果(图 1),结果显示,客户端向服务器发送 “Hello”,服务器向客户 端回复 “World”,持续了 10 次。

    图 1. Demo JZMQ 开始屏幕以及日志文件示例。

总结

本文逐步介绍了如何编译面向 Android x86 平台的 ZeroMQ 函数库。 并列举了消息 传输示例,以介绍如何在 Android 应用中使用 ZeroMQ。 如上所述,成功编译面向 x86 的 ZeroMQ 的关键是为基于 Android NDK 的 x86 生成正确的单机版工具链。 这种 方法不仅适用于 ZeroMQ,而且适用其他第三方函数库的构建。

参考资料

  1. ØMQ - http://en.wikipedia.org/wiki/%C3%98MQ
  2. 面向 Android 的 ZeroMQ 构建 - http://zeromq.org/build:android
  3. ØMQ - 指南 - http://zguide.zeromq.org/page:all

关于作者

Bin Zhu 是软件和解决方案事业部 (SSG) 开发人员关系部门英特尔® 凌动™ 处理器移 动支持团队的应用工程师。 他负责英特尔凌动处理器上的 Android 应用支持,并专注 于研究针对 Android x86 平台的多媒体技术。


Viewing all articles
Browse latest Browse all 583

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>