From 192a6bfc436abc789b2d0433532b6e6a78a995a4 Mon Sep 17 00:00:00 2001 From: Nanang Izzuddin Date: Thu, 19 Dec 2019 02:57:20 +0000 Subject: [PATCH] Fix #2256: Mini refactored Android configure script: - added CXXFLAGS & LDFLAGS parsing (from ndk-build output), CXXFLAGS was set to CFLAGS. - updated WebRTC instruction set to use SSE2, was generic, for Android emulator (x86 ABI). - updated C++ library/STL backend to use c++_shared, somehow '-lc++_static' is ignored after the refactor, also the official NDK docs mentions that c++_static may cause undefined behavior for app with multiple shared libraries (note pjsua2 app may use other shared libraries). git-svn-id: https://svn.pjsip.org/repos/pjproject/trunk@6120 74dad513-b988-da41-8d7b-12977e46ad98 --- aconfigure | 3 + aconfigure.ac | 3 + configure-android | 80 ++++++++++++++----- .../src/samples/android_sample/jni/Android.mk | 7 +- .../samples/android_sample/jni/Application.mk | 4 +- .../src/samples/android_sample/jni/dummy2.cc | 11 +++ pjsip-apps/src/swig/java/Makefile | 4 +- .../src/swig/java/android/app/build.gradle | 6 ++ pjsip/build/Makefile | 10 ++- third_party/build/webrtc/Makefile | 2 +- third_party/build/yuv/Makefile | 4 +- 11 files changed, 100 insertions(+), 34 deletions(-) create mode 100644 pjsip-apps/src/samples/android_sample/jni/dummy2.cc diff --git a/aconfigure b/aconfigure index 9e8b661cf..bdb41c3c4 100755 --- a/aconfigure +++ b/aconfigure @@ -9022,6 +9022,9 @@ $as_echo "Checking if libwebrtc is disabled...no" >&6; } mips*) ac_webrtc_instset=mips ;; + x86*) + ac_webrtc_instset=sse2 + ;; *) ac_webrtc_instset=generic ;; diff --git a/aconfigure.ac b/aconfigure.ac index d19115f2d..6d92cb21b 100644 --- a/aconfigure.ac +++ b/aconfigure.ac @@ -2084,6 +2084,9 @@ AC_ARG_ENABLE(libwebrtc, mips*) ac_webrtc_instset=mips ;; + x86*) + ac_webrtc_instset=sse2 + ;; *) ac_webrtc_instset=generic ;; diff --git a/configure-android b/configure-android index 5fdab3f5c..5b5205092 100755 --- a/configure-android +++ b/configure-android @@ -66,10 +66,14 @@ if test "$1" = "--use-ndk-cflags" || [ "${NDK_VER}" -ge "17" ]; then ADD_CFLAGS="0" ADD_CXXFLAGS="0" + ADD_LDFLAGS="0" ADD_NDK_TOOLCHAIN="0" ADD_NDK_TARGET="0" if test "x${IGNORE_CFLAGS}" = "x"; then - IGNORE_CFLAGS="\-M\|\-f*stack\|\-f*alias\|\-\" + IGNORE_CFLAGS="\-M\|\-f*stack\|\-f*alias\|\-\\|\-DNDEBUG\|\-O" + fi + if test "x${IGNORE_CPPFLAGS}" = "x"; then + IGNORE_CPPFLAGS="\-M\|\-f*stack\|\-f*alias\|\-\\|\-DNDEBUG\|\-O\|\-std\=" fi if test -f ${ANDROID_NDK_ROOT}/build/ndk-build; then @@ -84,9 +88,9 @@ if test "$1" = "--use-ndk-cflags" || [ "${NDK_VER}" -ge "17" ]; then exit 1 fi - echo "=====" - echo "NDK_OUT : ${NDK_OUT}" - echo "=====" + #echo "=====" + #echo "NDK_OUT : ${NDK_OUT}" + #echo "=====" for i in $NDK_OUT; do @@ -96,13 +100,15 @@ if test "$1" = "--use-ndk-cflags" || [ "${NDK_VER}" -ge "17" ]; then ADD_CXXFLAGS="0" continue fi + if test "$i" = "-c"; then + continue + fi if test "x`echo $i|grep 'dummy'`" != "x"; then continue fi - if test "x`echo $i|grep '\-\-sysroot='`" != "x"; then - ANDROID_SYSROOT=`echo $i|sed 's/--sysroot=//'`; + if test "x`echo $i|grep ${IGNORE_CPPFLAGS}`" = "x"; then + NDK_CXXFLAGS="${NDK_CXXFLAGS} $i" fi - NDK_CXXFLAGS="${NDK_CXXFLAGS} $i" continue fi @@ -132,6 +138,22 @@ if test "$1" = "--use-ndk-cflags" || [ "${NDK_VER}" -ge "17" ]; then continue fi + # Parse NDK LDFLAGS + if test "${ADD_LDFLAGS}" = "1"; then + if test "$i" = "-o"; then + ADD_LDFLAGS="0" + continue + fi + if test "x`echo $i|grep 'dummy'`" != "x"; then + continue + fi + if test "x`echo $i|grep '.so'`" != "x"; then + continue + fi + NDK_LDFLAGS="${NDK_LDFLAGS} $i" + continue + fi + # Find gcc or clang if test "x${NDK_CC}" = "x"; then if test "x`echo $i | grep 'gcc'`" != "x" -o "x`echo $i | grep 'clang'`" != "x"; then @@ -141,6 +163,7 @@ if test "$1" = "--use-ndk-cflags" || [ "${NDK_VER}" -ge "17" ]; then IS_USING_LLVM="1" #echo "---using llvm" fi + continue fi fi @@ -149,23 +172,34 @@ if test "$1" = "--use-ndk-cflags" || [ "${NDK_VER}" -ge "17" ]; then if test "x`echo $i | grep 'g++'`" != "x"; then NDK_CXX=$i ADD_CXXFLAGS="1" + continue + fi + fi + + # Find linking/LDFLAGS + if test "x${NDK_LDFLAGS}" = "x"; then + if test "x`echo $i | grep '\-\'`" != "x"; then + ADD_LDFLAGS="1" + continue fi fi # Find ar tool - if test "x${NDK_AR}" = "x" -a "x${NDK_CC}" != "x" -a "x`echo $i|grep '\-ar'`" != "x"; then - if test "$(dirname \"${NDK_CC}\")" = "$(dirname \"${i}\")"; then + if test "x${NDK_AR}" = "x" -a "x${NDK_CC}" != "x" -a "x`echo $i|grep '\-\'`" != "x"; then + # In some NDKs, e.g: r17c, gcc/clang and ar have different path + #if test "$(dirname \"${NDK_CC}\")" = "$(dirname \"${i}\")"; then NDK_AR=$i #echo "--- found AR=${NDK_AR}" - fi + continue + #fi fi # Find ranlib tool - if test "x${NDK_RANLIB}" = "x" -a "x${NDK_CC}" != "x" -a "x`echo $i|grep '\-ranlib'`" != "x"; then - if test "$(dirname \"${NDK_CC}\")" = "$(dirname \"${i}\")"; then + if test "x${NDK_RANLIB}" = "x" -a "x${NDK_CC}" != "x" -a "x`echo $i|grep '\-\'`" != "x"; then + #if test "$(dirname \"${NDK_CC}\")" = "$(dirname \"${i}\")"; then NDK_RANLIB=$i #echo "--- found RANLIB=${NDK_RANLIB}" - fi + #fi fi done @@ -192,7 +226,7 @@ if test "$1" = "--use-ndk-cflags" || [ "${NDK_VER}" -ge "17" ]; then NDK_CC_DIR=$(dirname "${NDK_CC}") NDK_AR=`find ${NDK_CC_DIR} -name "*ar" | grep -m 1 -v "gcc"` fi - export LDFLAGS="${LDFLAGS} --sysroot=${ANDROID_SYSROOT}" + export LDFLAGS="${LDFLAGS}" else # find ar and ranlib if test "x${NDK_AR}" = "x"; then @@ -201,7 +235,7 @@ if test "$1" = "--use-ndk-cflags" || [ "${NDK_VER}" -ge "17" ]; then if test "x${NDK_RANLIB}" = "x"; then NDK_RANLIB=`find ${NDK_TOOLCHAIN}/bin/ -name "*-ranlib" | grep -m 1 -v "gcc"` fi - export LDFLAGS="${LDFLAGS} --sysroot=${ANDROID_SYSROOT} -target ${NDK_TARGET} -gcc-toolchain ${NDK_TOOLCHAIN}" + export LDFLAGS="${LDFLAGS} -target ${NDK_TARGET} -gcc-toolchain ${NDK_TOOLCHAIN}" fi if test "x${NDK_RANLIB}" = "x"; then @@ -219,10 +253,11 @@ if test "$1" = "--use-ndk-cflags" || [ "${NDK_VER}" -ge "17" ]; then export CC="${NDK_CC}" export CXX="${NDK_CXX}" - export LIBS="${LIBS} -lc -lgcc -ldl" + export LDFLAGS="${NDK_LDFLAGS}" + export LIBS="${LIBS}" export CFLAGS="${NDK_CFLAGS} ${CFLAGS}" - export CPPFLAGS="${CFLAGS} -fexceptions -frtti" - export CXXFLAGS="${NDK_CXXFLAGS} -fexceptions -frtti" + export CPPFLAGS="${NDK_CXXFLAGS} ${CPPFLAGS}" + export CXXFLAGS="${CPPFLAGS}" else @@ -271,9 +306,10 @@ fi if test "${IS_USING_LLVM}" = "1"; then # llvm STDCPP_TC="${ANDROID_NDK_ROOT}/sources/cxx-stl/llvm-libc++" - STDCPP_CFLAGS="-I${STDCPP_TC}/include" - STDCPP_LIBS="-lc++_static -lc++abi" - STDCPP_LDFLAGS="-L${STDCPP_TC}/libs/${TARGET_ABI}/" + #STDCPP_CFLAGS="-I${STDCPP_TC}/include" + #STDCPP_LIBS="-lc++_static -lc++abi" + STDCPP_LIBS="${STDCPP_TC}/libs/${TARGET_ABI}/libc++_shared.so" + #STDCPP_LDFLAGS="-L${STDCPP_TC}/libs/${TARGET_ABI}/" else # gnustl STDCPP_TC_VER=`ls -d ${ANDROID_NDK_ROOT}/sources/cxx-stl/gnu-libstdc++/[0-9]* | sort -gr | head -1` @@ -290,6 +326,8 @@ fi export CFLAGS="${CFLAGS} ${STDCPP_CFLAGS}" export LIBS="${STDCPP_LIBS} ${LIBS}" export LDFLAGS="${LDFLAGS} ${STDCPP_LDFLAGS}" +export CPPFLAGS="${CPPFLAGS} ${STDCPP_CFLAGS}" +export CXXFLAGS="${CPPFLAGS}" # Print settings if test "1" = "1"; then diff --git a/pjsip-apps/src/samples/android_sample/jni/Android.mk b/pjsip-apps/src/samples/android_sample/jni/Android.mk index e45324276..bae2111d9 100644 --- a/pjsip-apps/src/samples/android_sample/jni/Android.mk +++ b/pjsip-apps/src/samples/android_sample/jni/Android.mk @@ -1,15 +1,12 @@ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) - LOCAL_MODULE := dummy_static -LOCAL_SRC_FILES := dummy.c - +LOCAL_SRC_FILES := dummy.c dummy2.cc include $(BUILD_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := dummy_shared LOCAL_STATIC_LIBRARIES := dummy_static -LOCAL_SRC_FILES := dummy.c - +LOCAL_SRC_FILES := dummy.c dummy2.cc include $(BUILD_SHARED_LIBRARY) diff --git a/pjsip-apps/src/samples/android_sample/jni/Application.mk b/pjsip-apps/src/samples/android_sample/jni/Application.mk index e619d92fc..8c58da6ff 100644 --- a/pjsip-apps/src/samples/android_sample/jni/Application.mk +++ b/pjsip-apps/src/samples/android_sample/jni/Application.mk @@ -1 +1,3 @@ -APP_ABI := all \ No newline at end of file +APP_ABI := all +APP_CPPFLAGS := -fexceptions -frtti +APP_STL := c++_shared diff --git a/pjsip-apps/src/samples/android_sample/jni/dummy2.cc b/pjsip-apps/src/samples/android_sample/jni/dummy2.cc new file mode 100644 index 000000000..c6b76bad7 --- /dev/null +++ b/pjsip-apps/src/samples/android_sample/jni/dummy2.cc @@ -0,0 +1,11 @@ +#include +#include +#include + +int main() { + uint64_t blah = 0; + size_t blah2 = 1; + std::string blah3 = "3"; + + return 0; +} diff --git a/pjsip-apps/src/swig/java/Makefile b/pjsip-apps/src/swig/java/Makefile index e782882d9..10ad7406e 100644 --- a/pjsip-apps/src/swig/java/Makefile +++ b/pjsip-apps/src/swig/java/Makefile @@ -163,9 +163,11 @@ all: $(LIBPJSUA2_SO) java $(LIBPJSUA2_SO): $(OUT_DIR)/pjsua2_wrap.o ifeq ($(OS),android) mkdir -p android/app/src/main/jniLibs/$(TARGET_ARCH) + # copy libc++_shared.so manually + cp -f ${ANDROID_NDK_ROOT}/sources/cxx-stl/llvm-libc++/libs/${TARGET_ARCH}/libc++_shared.so android/app/src/main/jniLibs/$(TARGET_ARCH) endif $(PJ_CXX) -shared -o $(LIBPJSUA2_SO) $(OUT_DIR)/pjsua2_wrap.o \ - $(MY_CFLAGS) $(MY_LDFLAGS) + $(MY_LDFLAGS) $(OUT_DIR)/pjsua2_wrap.o: $(OUT_DIR)/pjsua2_wrap.cpp Makefile $(PJ_CXX) -c $(OUT_DIR)/pjsua2_wrap.cpp -o $(OUT_DIR)/pjsua2_wrap.o \ diff --git a/pjsip-apps/src/swig/java/android/app/build.gradle b/pjsip-apps/src/swig/java/android/app/build.gradle index 2fab9e887..fd7103fff 100644 --- a/pjsip-apps/src/swig/java/android/app/build.gradle +++ b/pjsip-apps/src/swig/java/android/app/build.gradle @@ -12,6 +12,12 @@ android { ndk { moduleName "libpjsua2" } + + externalNativeBuild { + cmake { + arguments "-DANDROID_STL=c++_shared" + } + } } buildTypes { diff --git a/pjsip/build/Makefile b/pjsip/build/Makefile index b85c7817a..27ce4ea7a 100644 --- a/pjsip/build/Makefile +++ b/pjsip/build/Makefile @@ -46,8 +46,12 @@ export _CFLAGS := $(CC_CFLAGS) $(OS_CFLAGS) $(HOST_CFLAGS) $(M_CFLAGS) \ $(CC_INC)../../pjlib-util/include \ $(CC_INC)../../pjnath/include \ $(CC_INC)../../pjmedia/include -export _CXXFLAGS:= $(_CFLAGS) $(CC_CXXFLAGS) $(OS_CXXFLAGS) $(M_CXXFLAGS) \ - $(HOST_CXXFLAGS) $(CXXFLAGS) +export _CXXFLAGS:= $(CC_CXXFLAGS) $(OS_CXXFLAGS) $(M_CXXFLAGS) \ + $(HOST_CXXFLAGS) $(CXXFLAGS) $(CC_INC)../include \ + $(CC_INC)../../pjlib/include \ + $(CC_INC)../../pjlib-util/include \ + $(CC_INC)../../pjnath/include \ + $(CC_INC)../../pjmedia/include export _LDFLAGS := $(APP_THIRD_PARTY_LIBS) \ $(APP_THIRD_PARTY_EXT) \ $(CC_LDFLAGS) $(OS_LDFLAGS) $(M_LDFLAGS) $(HOST_LDFLAGS) \ @@ -140,7 +144,7 @@ export PJSUA2_LIB_OBJS += $(OS_OBJS) $(M_OBJS) $(CC_OBJS) $(HOST_OBJS) \ account.o endpoint.o json.o persistent.o types.o \ siptypes.o call.o presence.o media.o export PJSUA2_LIB_CFLAGS += $(_CFLAGS) $(PJ_VIDEO_CFLAGS) -export PJSUA2_LIB_CXXFLAGS = $(_CXXFLAGS) $(PJSUA2_LIB_CFLAGS) +export PJSUA2_LIB_CXXFLAGS = $(_CXXFLAGS) export PJSUA2_LIB_LDFLAGS += $(PJSUA_LIB_LDLIB) \ $(PJSIP_UA_LDLIB) \ $(PJSIP_SIMPLE_LDLIB) \ diff --git a/third_party/build/webrtc/Makefile b/third_party/build/webrtc/Makefile index 3e654379b..c504ce745 100644 --- a/third_party/build/webrtc/Makefile +++ b/third_party/build/webrtc/Makefile @@ -20,7 +20,7 @@ endif export _CFLAGS := $(CC_CFLAGS) $(OS_CFLAGS) $(HOST_CFLAGS) $(M_CFLAGS) \ $(CFLAGS) $(CC_INC). $(CC_INC)../../webrtc/src \ $(CC_INC)../../../pjlib/include -export _CXXFLAGS:= $(_CFLAGS) $(CC_CXXFLAGS) $(OS_CXXFLAGS) $(M_CXXFLAGS) \ +export _CXXFLAGS:= $(CC_CXXFLAGS) $(OS_CXXFLAGS) $(M_CXXFLAGS) \ $(HOST_CXXFLAGS) $(CXXFLAGS) export _LDFLAGS := $(CC_LDFLAGS) $(OS_LDFLAGS) $(M_LDFLAGS) $(HOST_LDFLAGS) \ $(LDFLAGS) diff --git a/third_party/build/yuv/Makefile b/third_party/build/yuv/Makefile index 24ea2a90e..efb0163a5 100644 --- a/third_party/build/yuv/Makefile +++ b/third_party/build/yuv/Makefile @@ -19,8 +19,8 @@ endif export _CFLAGS := $(CC_CFLAGS) $(OS_CFLAGS) $(HOST_CFLAGS) $(M_CFLAGS) \ $(CFLAGS) $(CC_INC). $(CC_INC)../../yuv/include \ $(CC_INC)../../../pjlib/include -export _CXXFLAGS:= $(_CFLAGS) $(CC_CXXFLAGS) $(OS_CXXFLAGS) $(M_CXXFLAGS) \ - $(HOST_CXXFLAGS) $(CXXFLAGS) +export _CXXFLAGS:= $(CC_CXXFLAGS) $(OS_CXXFLAGS) $(M_CXXFLAGS) \ + $(HOST_CXXFLAGS) $(CXXFLAGS) $(CC_INC). $(CC_INC)../../yuv/include export _LDFLAGS := $(CC_LDFLAGS) $(OS_LDFLAGS) $(M_LDFLAGS) $(HOST_LDFLAGS) \ $(LDFLAGS)