4

我尝试按照http://www.zeromq.org/build:android为 android 构建 zmq 但它不起作用,由于某种原因链接错误我不知道。

我用谷歌搜索了很多,但找不到正确的方法。

所以我放弃以官方方式构建它,我最终通过编写自己的Android.mk来构建它,我的操作系统是OSX 10.8.3,ndk是r8e,zeromq是3.2.2

.1。我复制 android-ndk-r8e/samples/ 下的 hello-jni 文件夹并将其重命名为 hello-zmq。.2. 将 zeromq-3.2.2/src 下的所有文件复制到 hello-zmq/jni .3。像这样修改platform.hpp(如果那里没有platform.hpp,则将其放在hello-zmq/jni下):

/* Define to 1 if you have the <alloca.h> header file. */
#define HAVE_ALLOCA_H 1

/* Define to 1 if you have the <arpa/inet.h> header file. */
#define HAVE_ARPA_INET_H 1

/* Define to 1 if you have the `clock_gettime' function. */
/* #undef HAVE_CLOCK_GETTIME */

/* Define to 1 if you have the <dlfcn.h> header file. */
#define HAVE_DLFCN_H 1

/* Define to 1 if you have the <errno.h> header file. */
#define HAVE_ERRNO_H 1

/* Define to 1 if you have the `freeifaddrs' function. */
#define HAVE_FREEIFADDRS 1

/* Define to 1 if you have the `gethrtime' function. */
/* #undef HAVE_GETHRTIME */

/* Define to 1 if you have the `getifaddrs' function. */
#define HAVE_GETIFADDRS 1

/* Define to 1 if you have the `gettimeofday' function. */
#define HAVE_GETTIMEOFDAY 1

/* Define to 1 if you have the <ifaddrs.h> header file. */
#define HAVE_IFADDRS_H 1

/* Define to 1 if you have the <inttypes.h> header file. */
#define HAVE_INTTYPES_H 1

/* Define to 1 if you have the `iphlpapi' library (-liphlpapi). */
/* #undef HAVE_LIBIPHLPAPI */

/* Define to 1 if you have the `nsl' library (-lnsl). */
/* #undef HAVE_LIBNSL */

/* Define to 1 if you have the `pthread' library (-lpthread). */
#define HAVE_LIBPTHREAD 1

/* Define to 1 if you have the `rpcrt4' library (-lrpcrt4). */
/* #undef HAVE_LIBRPCRT4 */

/* Define to 1 if you have the `rt' library (-lrt). */
/* #undef HAVE_LIBRT */

/* Define to 1 if you have the `socket' library (-lsocket). */
/* #undef HAVE_LIBSOCKET */

/* Define to 1 if you have the `ws2_32' library (-lws2_32). */
/* #undef HAVE_LIBWS2_32 */

/* Define to 1 if you have the <limits.h> header file. */
#define HAVE_LIMITS_H 1

/* Define to 1 if you have the <memory.h> header file. */
#define HAVE_MEMORY_H 1

/* Define to 1 if you have the `memset' function. */
#define HAVE_MEMSET 1

/* Define to 1 if you have the <netinet/in.h> header file. */
#define HAVE_NETINET_IN_H 1

/* Define to 1 if you have the <netinet/tcp.h> header file. */
#define HAVE_NETINET_TCP_H 1

/* Define to 1 if you have the `perror' function. */
#define HAVE_PERROR 1

/* Define to 1 if you have the `socket' function. */
#define HAVE_SOCKET 1

/* Define to 1 if stdbool.h conforms to C99. */
#define HAVE_STDBOOL_H 1

/* Define to 1 if you have the <stddef.h> header file. */
#define HAVE_STDDEF_H 1

/* Define to 1 if you have the <stdint.h> header file. */
#define HAVE_STDINT_H 1

/* Define to 1 if you have the <stdlib.h> header file. */
#define HAVE_STDLIB_H 1

/* Define to 1 if you have the <strings.h> header file. */
#define HAVE_STRINGS_H 1

/* Define to 1 if you have the <string.h> header file. */
#define HAVE_STRING_H 1

/* Define to 1 if you have the <sys/eventfd.h> header file. */
/* #undef HAVE_SYS_EVENTFD_H */

/* Define to 1 if you have the <sys/socket.h> header file. */
#define HAVE_SYS_SOCKET_H 1

/* Define to 1 if you have the <sys/stat.h> header file. */
#define HAVE_SYS_STAT_H 1

/* Define to 1 if you have the <sys/time.h> header file. */
#define HAVE_SYS_TIME_H 1

/* Define to 1 if you have the <sys/types.h> header file. */
#define HAVE_SYS_TYPES_H 1

/* Define to 1 if you have the <sys/uio.h> header file. */
#define HAVE_SYS_UIO_H 1

/* Define to 1 if you have the <time.h> header file. */
#define HAVE_TIME_H 1

/* Define to 1 if you have the <unistd.h> header file. */
#define HAVE_UNISTD_H 1

/* Define to 1 if you have the <windows.h> header file. */
/* #undef HAVE_WINDOWS_H */

/* Define to 1 if the system has the type `_Bool'. */
/* #undef HAVE__BOOL */

/* Define to the sub-directory in which libtool stores uninstalled libraries.
 */
#define LT_OBJDIR ".libs/"

/* Define to 1 if your C compiler doesn't accept -c and -o together. */
/* #undef NO_MINUS_C_MINUS_O */

/* Name of package */
#define PACKAGE "zeromq"

/* Define to the address where bug reports for this package should be sent. */
#define PACKAGE_BUGREPORT "zeromq-dev@lists.zeromq.org"

/* Define to the full name of this package. */
#define PACKAGE_NAME "zeromq"

/* Define to the full name and version of this package. */
#define PACKAGE_STRING "zeromq 3.2.2"

/* Define to the one symbol short name of this package. */
#define PACKAGE_TARNAME "zeromq"

/* Define to the home page for this package. */
#define PACKAGE_URL ""

/* Define to the version of this package. */
#define PACKAGE_VERSION "3.2.2"

/* Define as the return type of signal handlers (`int' or `void'). */
#define RETSIGTYPE void

/* Define to 1 if you have the ANSI C header files. */
#define STDC_HEADERS 1

/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
#define TIME_WITH_SYS_TIME 1

/* Version number of package */
#define VERSION "3.2.2"

/* Force to use mutexes */
/* #undef ZMQ_FORCE_MUTEXES */

/* Have AIX OS */
/* #undef ZMQ_HAVE_AIX */

/* Have Android OS */
#define ZMQ_HAVE_ANDROID 1

/* Have Cygwin */
/* #undef ZMQ_HAVE_CYGWIN */

/* Have eventfd extension. */
//#define ZMQ_HAVE_EVENTFD 1

/* Have FreeBSD OS */
/* #undef ZMQ_HAVE_FREEBSD */

/* Have HPUX OS */
/* #undef ZMQ_HAVE_HPUX */

/* Have ifaddrs.h header. */
//#define ZMQ_HAVE_IFADDRS 1

/* Have Linux OS */
#define ZMQ_HAVE_LINUX 1

/* Have MinGW32 */
/* #undef ZMQ_HAVE_MINGW32 */

/* Have NetBSD OS */
/* #undef ZMQ_HAVE_NETBSD */

/* Have OpenBSD OS */
/* #undef ZMQ_HAVE_OPENBSD */

/* Have OpenPGM extension */
/* #undef ZMQ_HAVE_OPENPGM */

/* Have DarwinOSX OS */
//#define ZMQ_HAVE_OSX 1

/* Have QNX Neutrino OS */
/* #undef ZMQ_HAVE_QNXNTO */

/* Whether SOCK_CLOEXEC is defined and functioning. */
/* #undef ZMQ_HAVE_SOCK_CLOEXEC */

/* Have Solaris OS */
/* #undef ZMQ_HAVE_SOLARIS */

/* Whether SO_KEEPALIVE is supported. */
//#define ZMQ_HAVE_SO_KEEPALIVE 1

/* Whether TCP_KEEPALIVE is supported. */
//#define ZMQ_HAVE_TCP_KEEPALIVE 1

/* Whether TCP_KEEPCNT is supported. */
/* #undef ZMQ_HAVE_TCP_KEEPCNT */

/* Whether TCP_KEEPIDLE is supported. */
/* #undef ZMQ_HAVE_TCP_KEEPIDLE */

/* Whether TCP_KEEPINTVL is supported. */
/* #undef ZMQ_HAVE_TCP_KEEPINTVL */

/* Have uio.h header. */
#define ZMQ_HAVE_UIO 1

/* Have Windows OS */
/* #undef ZMQ_HAVE_WINDOWS */

/* Define for Solaris 2.5.1 so the uint32_t typedef from <sys/synch.h>,
 <pthread.h>, or <semaphore.h> is not used. If the typedef were allowed, the
 #define below would cause a syntax error. */
/* #undef _UINT32_T */

/* Define to empty if `const' does not conform to ANSI C. */
/* #undef const */

/* Define to `__inline__' or `__inline' if that's what the C compiler
 calls it, or to nothing if 'inline' is not supported under any name.  */
#ifndef __cplusplus
/* #undef inline */
#endif

/* Define to `unsigned int' if <sys/types.h> does not define. */
/* #undef size_t */

/* Define to `int' if <sys/types.h> does not define. */
/* #undef ssize_t */

/* Define to the type of an unsigned integer type of width exactly 32 bits if
 such a type exists and the standard includes do not define it. */
/* #undef uint32_t */

/* Define to empty if the keyword `volatile' does not work. Warning: valid
 code using `volatile' can become incorrect without. Disable with care. */
/* #undef volatile */

.4. 然后在 hello-zmq/jni 下编写一个 Android.mk 文件,如下所示:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_C_INCLUDES  := $(LOCAL_PATH) \
  /opt/android-toolchain/sysroot/usr/include \


LOCAL_MODULE := zeromq
LOCAL_SRC_FILES := address.cpp \
  clock.cpp \
  ctx.cpp \
  dealer.cpp \
  decoder.cpp \
  devpoll.cpp \
  dist.cpp \
  encoder.cpp \
  epoll.cpp \
  err.cpp \
  fq.cpp \
  io_object.cpp \
  io_thread.cpp \
  ip.cpp \
  ipc_address.cpp \
  ipc_connecter.cpp \
  ipc_listener.cpp \
  kqueue.cpp \
  lb.cpp \
  mailbox.cpp \
  msg.cpp \
  mtrie.cpp \
  object.cpp \
  options.cpp \
  own.cpp \
  pair.cpp \
  pgm_receiver.cpp \
  pgm_sender.cpp \
  pgm_socket.cpp \
  pipe.cpp \
  poll.cpp \
  poller_base.cpp \
  precompiled.cpp \
  proxy.cpp \
  pub.cpp \
  pull.cpp \
  push.cpp \
  random.cpp \
  reaper.cpp \
  rep.cpp \
  req.cpp \
  router.cpp \
  select.cpp \
  session_base.cpp \
  signaler.cpp \
  socket_base.cpp \
  stream_engine.cpp \
  sub.cpp \
  tcp.cpp \
  tcp_address.cpp \
  tcp_connecter.cpp \
  tcp_listener.cpp \
  thread.cpp \
  trie.cpp \
  v1_decoder.cpp \
  v1_encoder.cpp \
  xpub.cpp \
  xsub.cpp \
  zmq.cpp \
  zmq_utils.cpp

LOCAL_CPPFLAGS += -D_REENTRANT -D_THREAD_SAFE -DZMQ_FORCE_POLL -fPIC

include $(BUILD_STATIC_LIBRARY)


include $(CLEAR_VARS)
LOCAL_MODULE := zeromq-jni
LOCAL_STATIC_LIBRARIES := zeromq

include $(BUILD_SHARED_LIBRARY)

.5. 在hello-zmq/jni下写一个Application.mk:

APP_STL := gnustl_static

.6. 确保您已遵循http://www.zeromq.org/build:android的一般先决条件 make-standalone-toolchain 部分。

.7. 在 hello-zmq/jni 文件夹下使用 ./ndk-build,静态库 libzeromq.a 将可用。

我已经对 android 设备进行了测试,它工作正常。

我仍在寻找为 android 构建 zeromq 的官方方法...

4

0 回答 0