我尝试按照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 的官方方法...