android - 为 Android 编译 libnice

标签 android android-ndk stun turn libnice

我正在尝试为 Android 编译 libnice(具体为 v0.18),但遇到了一些麻烦。我如何为 Android 编译 libnice?到目前为止,我已在下面列出了我的尝试。

第一次尝试

我的第一次尝试是使用自定义 Android.mk 生成文件,但我收到一条错误消息 AI_NUMERICHOST undeclared (添加 #include <netdb.h> 没有解决这个问题,我在这里没有想法)。请参阅下面我的 Android.mk

LOCAL_PATH  := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE        := glib
LOCAL_SRC_FILES     := lib/libglib-2.0.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE        := gobject
LOCAL_SRC_FILES     := lib/libgobject-2.0.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE        := gmodule
LOCAL_SRC_FILES     := lib/libgmodule-2.0.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE        := gio
LOCAL_SRC_FILES     := lib/libgio-2.0.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE        := gthread
LOCAL_SRC_FILES     := lib/libgthread-2.0.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE        := ffi
LOCAL_SRC_FILES     := lib/libffi.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE        := iconv
LOCAL_SRC_FILES     := lib/libiconv.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE        := intl
LOCAL_SRC_FILES     := lib/libintl.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE        := xml2
LOCAL_SRC_FILES     := lib/libxml2.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE        := z
LOCAL_SRC_FILES     := lib/libz.a
include $(PREBUILT_STATIC_LIBRARY)


include $(CLEAR_VARS)
NICE                := libnice-0.1.8
LOCAL_MODULE        := ice_jni
LOCAL_LDLIBS        := -llog 

LOCAL_STATIC_LIBRARIES  := glib gobject gmodule gio gthread ffi iconv intl xml2 z 

NICE_INCLUDES       := $(LOCAL_PATH)/include \
                        $(LOCAL_PATH)/lib/glib-2.0/include \
                        $(LOCAL_PATH)/lib/libffi-3.0.13/include \
                        $(wildcard $(LOCAL_PATH)/include/*) \
                        $(LOCAL_PATH)/$(NICE)/nice \
                        $(LOCAL_PATH)/$(NICE)/agent \
                        $(LOCAL_PATH)/$(NICE)/random \
                        $(LOCAL_PATH)/$(NICE)/socket \
                        $(LOCAL_PATH)/$(NICE)/stun

NICE_SRC            := $(patsubst $(LOCAL_PATH)/%, %, $(wildcard $(LOCAL_PATH)/$(NICE)/agent/*.c)) \
                        $(patsubst $(LOCAL_PATH)/%, %, $(wildcard $(LOCAL_PATH)/$(NICE)/random/*.c)) \
                        $(patsubst $(LOCAL_PATH)/%, %, $(wildcard $(LOCAL_PATH)/$(NICE)/socket/*.c)) \
                        $(patsubst $(LOCAL_PATH)/%, %, $(wildcard $(LOCAL_PATH)/$(NICE)/stun/*.c))

LOCAL_C_INCLUDES        := $(LOCAL_PATH) \
                            $(NICE_INCLUDES)

LOCAL_SRC_FILES         := ICE.cpp \
                            $(NICE_SRC)

include $(BUILD_SHARED_LIBRARY)

静态库是从gstreamer 1.4.1调试版复制过来的,按照the guide选择的如以下所说的。

第二次尝试

然后我尝试编译一个引用 this guide 的静态库,这又引起了麻烦:

export PKG_CONFIG_PATH=`pwd`/../gstreamer/lib/pkgconfig  
export CFLAGS="--sysroot=`pwd`/../toolchain/sysroot"
./configure --prefix=`pwd`/../build --host=arm-linux-androideabi

这会导致以下错误。添加-mthumb-marm到 CFLAGS 会产生一个 C compiler cannot create executables配置期间出错。

stunagent.c: Assembler messages:
stunagent.c:160: Error: no such instruction: `rev %eax,%eax'
stunagent.c:676: Error: no such instruction: `rev16 %ax,%ax'

提到的行不包含 ASM 但调用了 htonsntohl ,所以我想我做错了什么......

我用了make_standalone_toolchain来自 NDK,使用各种 Android 版本来创建工具链。

有人可以帮忙吗?提前致谢! ~

最佳答案

最后!这花了我太多时间。问题在于 libnice 在配置期间创建了一个 config.h 文件,该文件定义了一些宏(HAVE_NETDB_H 等)。虽然我无法使用我的工具链编译 libnice,但我能够生成一个我可以使用的有效 config.h。在此之后,我不得不对我的 Android.mk 进行一些额外的调整。我将在下面发布这两个文件以供其他人寻找答案。

(注意:您仍然需要 glib。由于我的项目使用 gstreamer,所以我能够使用由包含 glib 的 gstreamer 构建脚本创建的共享库。)

干杯!

========================

Android.mk

LOCAL_PATH  := $(call my-dir)

include $(CLEAR_VARS)
NICE                    := libnice-0.1.8
LOCAL_MODULE            := nice_jni
LOCAL_LDLIBS            := -llog 

LOCAL_SHARED_LIBRARIES  := gstreamer_android
LOCAL_CFLAGS            += -DHAVE_CONFIG_H

NICE_DIRS               := $(LOCAL_PATH)/$(NICE)/ \
                            $(LOCAL_PATH)/$(NICE)/agent/ \
                            $(LOCAL_PATH)/$(NICE)/nice/ \
                            $(LOCAL_PATH)/$(NICE)/random/ \
                            $(LOCAL_PATH)/$(NICE)/socket/ \
                            $(LOCAL_PATH)/$(NICE)/stun/ \
                            $(LOCAL_PATH)/$(NICE)/stun/usages/
#                           $(LOCAL_PATH)/$(NICE)/stun/tools/ \

NICE_INCLUDES           := $(NICE_DIRS)
NICE_SRC                := $(filter-out %test.c, $(foreach dir, $(NICE_DIRS), $(patsubst $(LOCAL_PATH)/%, %, $(wildcard $(addsuffix *.c, $(dir)))) ))

LOCAL_C_INCLUDES        := $(NICE_INCLUDES) #add your own headers if needed

LOCAL_SRC_FILES         := [YOUR_SRC_FILES] \
                            $(NICE_SRC)

include $(BUILD_SHARED_LIBRARY)

config.h

(这应该不会因平台和 Android 版本而异。我特意将评论留在其中以供将来引用)

/* config.h.  Generated from config.h.in by configure.  */
/* config.h.in.  Generated from configure.ac by autoheader.  */

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

/* Define to 1 if C supports variable-length arrays. */
#define HAVE_C_VARARRAYS 1

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

/* Whether getifaddrs() is available on the system */
/* #undef HAVE_GETIFADDRS */

/* Have the GUPnP IGD library */
/* #undef HAVE_GUPNP */

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

/* Define to 1 if you have the <inttypes.h> header file. */
#define HAVE_INTTYPES_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 <netdb.h> header file. */
#define HAVE_NETDB_H 1

/* Define to 1 if you have the <net/in.h> header file. */
/* #undef HAVE_NET_IN_H */

/* Define to 1 if you have the `poll' function. */
#define HAVE_POLL 1

/* Define to 1 if the system has the type `size_t'. */
#define HAVE_SIZE_T 1

/* Define to 1 if the system has the type `ssize_t'. */
#define HAVE_SSIZE_T 1

/* Define to 1 if stdbool.h conforms to C99. */
#define HAVE_STDBOOL_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/stat.h> header file. */
#define HAVE_SYS_STAT_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 <unistd.h> header file. */
#define HAVE_UNISTD_H 1

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

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

/* Define to 1 if assertions should be disabled. */
/* #undef NDEBUG */

/* Public library function implementation */
#define NICEAPI_EXPORT 

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

/* Define to the address where bug reports for this package should be sent. */
#define PACKAGE_BUGREPORT ""

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

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

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

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

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

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

/* Enable extensions on AIX 3, Interix.  */
#ifndef _ALL_SOURCE
# define _ALL_SOURCE 1
#endif
/* Enable GNU extensions on systems that have them.  */
#ifndef _GNU_SOURCE
# define _GNU_SOURCE 1
#endif
/* Enable threading extensions on Solaris.  */
#ifndef _POSIX_PTHREAD_SEMANTICS
# define _POSIX_PTHREAD_SEMANTICS 1
#endif
/* Enable extensions on HP NonStop.  */
#ifndef _TANDEM_SOURCE
# define _TANDEM_SOURCE 1
#endif
/* Enable general extensions on Solaris.  */
#ifndef __EXTENSIONS__
# define __EXTENSIONS__ 1
#endif


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

/* Define to `2' to get GNU/libc warnings. */
/* Only define if -O1 or more is enabled */
#if defined __OPTIMIZE__ && __OPTIMIZE__ > 0
# define _FORTIFY_SOURCE 2
#endif

/* Define to 1 if on MINIX. */
/* #undef _MINIX */

/* Define to 2 if the system does not provide POSIX.1 features except with
   this defined. */
/* #undef _POSIX_1_SOURCE */

/* Define to 1 if you need to in order for `stat' and other things to work. */
/* #undef _POSIX_SOURCE */

/* Needed to get declarations for msg_control and msg_controllen on Solaris */
/* #undef _XOPEN_SOURCE */

/* Needed to get declarations for msg_control and msg_controllen on Solaris */
#define __EXTENSIONS__ 1

/* Define to the equivalent of the C99 'restrict' keyword, or to
   nothing if this is not supported.  Do not define if restrict is
   supported directly.  */
#define restrict __restrict
/* Work around a bug in Sun C++: it does not support _Restrict or
   __restrict__, even though the corresponding Sun C compiler ends up with
   "#define restrict _Restrict" or "#define restrict __restrict__" in the
   previous line.  Perhaps some future version of Sun C++ will work with
   restrict; if so, hopefully it defines __RESTRICT like Sun C does.  */
#if defined __SUNPRO_CC && !defined __RESTRICT
# define _Restrict
# define __restrict__
#endif

关于android - 为 Android 编译 libnice,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26485507/

相关文章:

android - SQLite中的多线程数据写入

android - 如何在 OpenGL 图像查看器中跟踪 'highlights'

visual-studio - Microsoft AndroidNKD64 文件夹占用巨大的磁盘空间。如何去除?

docker - 如何在公司代理后面使用 stun.l.google.com?

android - 在没有终端的情况下从 Android Studio 更改 BitBucket 的用户名

Java Home 不同吗?如何在Android Studio中正确设置?

android - cpuminer Android 中的 Curl 库

android - 如何在 C/Android NDK 中将字符串日期转换为毫秒

node.js - 如何自托管不依赖 WebRTC STUN 服务器 stun.l.google.com :19302?

webrtc - 什么在没有指定 STUN 服务器的本地 webRTC 应用程序上生成 ICE 候选?