由于项目需要,用了gloox库,但是gloox官网没有很详细的编译的makefile文件,所以花了点时间,使用Android.mk来编译。
首先大部分的编译脚本是https://github.com/rxwen/gloox/blob/master/Android.mk这个提供的。
我是在他的基础上进行编译,出了问题进行一些修改,下面的是在本机上试验通过的。
如果使用如下编译有std::string赋值问题的话,可以参考https://blog.csdn.net/u011803341/article/details/99977138
使用的是gloox最新版1.0.22
NDK r10e
macOS 10.14.5
首先需要在gloox_1.0.22文件夹内建一个jni文件夹,里面包含两个文件Android.mk和Application.mk两个文件。文件放置好之后,在jni文件夹目录下执行ndk-build指令,就可以编译出libgloox.so库了。
对于Android.mk的改动主要是:
1. LOCAL_SRC_FILES:=\ ./src/disco.cpp \ 改为LOCAL_SRC_FILES:=\ ../src/disco.cpp \也就是多了一个"."。
2.添加了LOCAL_LDLIBS += -lz(需要用到libz这个库)
3.修改了
LOCAL_C_INCLUDES += \
$(LOCAL_PATH)/.. \
$(LOCAL_PATH)/../src \
$(LOCAL_PATH)/src
主要是这三个修改。
然后如果编译时出现dns.cpp文件中res_querydomain函数找不到的问题,可以先把#if defined( HAVE_RES_QUERYDOMAIN ) && defined( HAVE_DN_SKIPNAME ) && defined( HAVE_RES_QUERY )的宏定义改为#if 0也就是先不定义这个函数,让库先边处理来,问题后面处理。
Android.mk文件
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:=\
../src/disco.cpp \
../src/gpgencrypted.cpp \
../src/privacymanager.cpp \
../src/gloox.cpp \
../src/iodata.cpp \
../src/connectiontcpbase.cpp \
../src/connectionbosh.cpp \
../src/attention.cpp \
../src/gpgsigned.cpp \
../src/stanza.cpp \
../src/tlsgnutlsclient.cpp \
../src/mucroom.cpp \
../src/tlsopensslbase.cpp \
../src/messageeventfilter.cpp \
../src/dataformfield.cpp \
../src/base64.cpp \
../src/siprofileft.cpp \
../src/util.cpp \
../src/tlsschannel.cpp \
../src/subscription.cpp \
../src/tlsopensslclient.cpp \
../src/instantmucroom.cpp \
../src/receipt.cpp \
../src/registration.cpp \
../src/tlsopensslserver.cpp \
../src/iq.cpp \
../src/connectionsocks5proxy.cpp \
../src/pubsubitem.cpp \
../src/vcard.cpp \
../src/xhtmlim.cpp \
../src/tlsgnutlsbase.cpp \
../src/jinglesession.cpp \
../src/stanzaextensionfactory.cpp \
../src/connectiontcpclient.cpp \
../src/capabilities.cpp \
../src/logsink.cpp \
../src/tlsgnutlsserveranon.cpp \
../src/connectiontlsserver.cpp \
../src/socks5bytestreamserver.cpp \
../src/error.cpp \
../src/pubsubevent.cpp \
../src/nonsaslauth.cpp \
../src/rostermanager.cpp \
../src/clientbase.cpp \
../src/privacyitem.cpp \
../src/mucinvitationhandler.cpp \
../src/simanager.cpp \
../src/inbandbytestream.cpp \
../src/dns.cpp \
../src/connectiontls.cpp \
../src/compressiondefault.cpp \
../src/connectionhttpproxy.cpp \
../src/annotations.cpp \
../src/carbons.cpp \
../src/jingleiceudp.cpp \
../src/delayeddelivery.cpp \
../src/connectiontcpserver.cpp \
../src/mutex.cpp \
../src/chatstate.cpp \
../src/uniquemucroom.cpp \
../src/jinglepluginfactory.cpp \
../src/vcardupdate.cpp \
../src/dataformfieldcontainer.cpp \
../src/socks5bytestreammanager.cpp \
../src/jid.cpp \
../src/socks5bytestream.cpp \
../src/prep.cpp \
../src/sha.cpp \
../src/tag.cpp \
../src/lastactivity.cpp \
../src/client.cpp \
../src/flexoff.cpp \
../src/jinglefiletransfer.cpp \
../src/bookmarkstorage.cpp \
../src/amp.cpp \
../src/atomicrefcount.cpp \
../src/component.cpp \
../src/pubsubmanager.cpp \
../src/md5.cpp \
../src/rosteritem.cpp \
../src/oob.cpp \
../src/search.cpp \
../src/dataform.cpp \
../src/forward.cpp \
../src/presence.cpp \
../src/chatstatefilter.cpp \
../src/messageevent.cpp \
../src/vcardmanager.cpp \
../src/tlsdefault.cpp \
../src/dataformitem.cpp \
../src/compressionzlib.cpp \
../src/nickname.cpp \
../src/messagefilter.cpp \
../src/tlsgnutlsclientanon.cpp \
../src/softwareversion.cpp \
../src/privatexml.cpp \
../src/mucmessagesession.cpp \
../src/linklocalclient.cpp \
../src/shim.cpp \
../src/linklocalmanager.cpp \
../src/message.cpp \
../src/jinglesessionmanager.cpp \
../src/adhoc.cpp \
../src/messagesession.cpp \
../src/parser.cpp \
../src/featureneg.cpp \
../src/dataformreported.cpp \
../src/jinglecontent.cpp \
../src/eventdispatcher.cpp
LOCAL_LDLIBS += -lz
LOCAL_CFLAGS := -O2 -g -D__ANDROID__
#LOCAL_CFLAGS += -DHAVE_CONFIG_H -D_U_="__attribute__((unused))"
LOCAL_C_INCLUDES += \
$(LOCAL_PATH)/.. \
$(LOCAL_PATH)/../src \
$(LOCAL_PATH)/src
ifneq ($(TARGET_SIMULATOR),true)
LOCAL_C_INCLUDES += bionic # very important!
LOCAL_C_INCLUDES += external/stlport/stlport
LOCAL_SHARED_LIBRARIES += libstlport libdl libz
endif
LOCAL_MODULE_TAGS := eng
LOCAL_MODULE := libgloox
include $(BUILD_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:=\
./src/examples/register_example.cpp
LOCAL_SHARED_LIBRARIES += libgloox
LOCAL_MODULE := register_example
ifneq ($(TARGET_SIMULATOR),true)
LOCAL_C_INCLUDES += bionic # very important!
LOCAL_C_INCLUDES += external/stlport/stlport
LOCAL_SHARED_LIBRARIES += libstlport libdl
endif
include $(BUILD_EXECUTABLE)
Application.mk
#NDK_TOOLCHAIN_VERSION = 4.9 r13->default: clang #stlport_static gnustl_static
APP_STL := gnustl_static
APP_ABI := armeabi
APP_CPPFLAGS +=-fpermissive -frtti
APP_CPPFLAGS +=-std=c++11
APP_PLATFORM := android-9
#NDK_TOOLCHAIN_VERSION=4.9