mirror of
https://git.jami.net/savoirfairelinux/jami-daemon.git
synced 2025-08-12 22:09:25 +08:00
build/cmake: allow to build JNI layer for Android
Change-Id: I7b22ee47240a0d17175492b30369e51bdf657358
This commit is contained in:

committed by
Adrien Béraud

parent
da692fd3da
commit
a5fcd271e8
231
CMakeLists.txt
231
CMakeLists.txt
@ -1,16 +1,41 @@
|
||||
cmake_minimum_required(VERSION 3.15)
|
||||
cmake_minimum_required(VERSION 3.16)
|
||||
|
||||
project(ring-daemon C CXX)
|
||||
project(jami-daemon CXX)
|
||||
set(PACKAGE_NAME "Jami Daemon")
|
||||
|
||||
################################################################################
|
||||
# Build options
|
||||
################################################################################
|
||||
option(JAMI_NATPMP "Build with NAT-PMP" ON)
|
||||
option(JAMI_PUPNP "Build with PUPNP" ON)
|
||||
option(JAMI_PLUGIN "Build with plugin support" ON)
|
||||
option(JAMI_JNI "Build the JNI binding" OFF)
|
||||
option(JAMI_VIDEO "Build with video support" ON)
|
||||
|
||||
################################################################################
|
||||
# Check dependencies
|
||||
################################################################################
|
||||
|
||||
if(NOT MSVC)
|
||||
include(FindPkgConfig)
|
||||
if (JAMI_NATPNP)
|
||||
pkg_search_module (natpmp REQUIRED IMPORTED_TARGET natpmp)
|
||||
endif()
|
||||
if (JAMI_PUPNP)
|
||||
pkg_search_module (upnp REQUIRED IMPORTED_TARGET upnp libupnp)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
################################################################################
|
||||
# Source groups
|
||||
################################################################################
|
||||
|
||||
# compat, src source group
|
||||
if(MSVC)
|
||||
add_subdirectory("compat")
|
||||
endif()
|
||||
|
||||
add_subdirectory("compat")
|
||||
add_subdirectory("src")
|
||||
|
||||
source_group("Source Files" FILES ${Source_Files})
|
||||
source_group("Source Files\\client" FILES ${Source_Files__client})
|
||||
source_group("Source Files\\config" FILES ${Source_Files__config})
|
||||
@ -42,6 +67,20 @@ if(MSVC)
|
||||
source_group("Source Files\\media\\video\\winvideo" FILES ${Source_Files__media__video__winvideo})
|
||||
endif()
|
||||
|
||||
# Android target mapping for contrib
|
||||
if (ANDROID_ABI STREQUAL "x86")
|
||||
set(TARGET "i686-linux-android")
|
||||
elseif (ANDROID_ABI STREQUAL "x86_64")
|
||||
set(TARGET "x86_64-linux-android")
|
||||
elseif (ANDROID_ABI STREQUAL "arm64-v8a")
|
||||
set(TARGET "aarch64-linux-android")
|
||||
elseif (ANDROID_ABI STREQUAL "armeabi-v7a")
|
||||
set(TARGET "arm-linux-androideabi")
|
||||
else()
|
||||
set(TARGET ${TARGET})
|
||||
endif()
|
||||
set(CONTRIB_PATH ${CMAKE_CURRENT_SOURCE_DIR}/contrib/${TARGET})
|
||||
|
||||
list (APPEND ALL_FILES
|
||||
${Source_Files}
|
||||
${Source_Files__client}
|
||||
@ -62,30 +101,82 @@ list (APPEND ALL_FILES
|
||||
${Source_Files__sip}
|
||||
${Source_Files__upnp}
|
||||
${Source_Files__upnp__protocol}
|
||||
${Source_Files__upnp__protocol__natpmp}
|
||||
${Source_Files__upnp__protocol__pupnp}
|
||||
${Source_Files__plugin}
|
||||
)
|
||||
|
||||
if (JAMI_NATPMP)
|
||||
list (APPEND ALL_FILES ${Source_Files__upnp__protocol__natpmp})
|
||||
endif()
|
||||
if (JAMI_PUPNP)
|
||||
list (APPEND ALL_FILES ${Source_Files__upnp__protocol__pupnp})
|
||||
endif()
|
||||
if (JAMI_PLUGIN)
|
||||
list (APPEND ALL_FILES ${Source_Files__plugin})
|
||||
endif()
|
||||
if (ANDROID)
|
||||
list (APPEND ALL_FILES ${ALL_FILES}
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/src/media/video/androidvideo/video_device_impl.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/src/media/video/androidvideo/video_device_monitor_impl.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/src/media/audio/opensl/audio_player.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/src/media/audio/opensl/audio_recorder.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/src/media/audio/opensl/opensllayer.cpp
|
||||
)
|
||||
endif()
|
||||
if(MSVC)
|
||||
list (APPEND ALL_FILES ${ALL_FILES}
|
||||
"${Source_Files__media__audio__portaudio}"
|
||||
"${Source_Files__media__video__uwpvideo}"
|
||||
"${Source_Files__media__video__winvideo}"
|
||||
)
|
||||
endif()
|
||||
|
||||
add_library(${PROJECT_NAME} STATIC ${ALL_FILES})
|
||||
set_target_properties(${PROJECT_NAME} PROPERTIES FOLDER "daemon")
|
||||
set_target_properties (${PROJECT_NAME} PROPERTIES CXX_STANDARD 17)
|
||||
target_compile_definitions(${PROJECT_NAME} PRIVATE
|
||||
PACKAGE_NAME="${PACKAGE_NAME}"
|
||||
PACKAGE="jami"
|
||||
LIBJAMI_BUILD
|
||||
HAVE_RINGNS
|
||||
ASIO_STANDALONE
|
||||
MSGPACK_NO_BOOST
|
||||
)
|
||||
if (JAMI_VIDEO)
|
||||
target_compile_definitions(${PROJECT_NAME} PRIVATE ENABLE_VIDEO)
|
||||
endif()
|
||||
if (JAMI_PLUGIN)
|
||||
target_compile_definitions(${PROJECT_NAME} PRIVATE ENABLE_PLUGIN)
|
||||
endif()
|
||||
if (JAMI_NATPMP)
|
||||
target_compile_definitions(${PROJECT_NAME} PRIVATE HAVE_LIBNATPMP)
|
||||
endif()
|
||||
if (ANDROID)
|
||||
target_compile_definitions(${PROJECT_NAME} PRIVATE HAVE_OPENSL)
|
||||
endif()
|
||||
target_include_directories(${PROJECT_NAME} PRIVATE
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/.;"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/src/config;"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/src/connectivity;"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/src/connectivity/security;"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/src/connectivity/sip;"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/src/connectivity/upnp;"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/src/connectivity/upnp/igd;"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/src/connectivity/upnp/protocol;"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/src/connectivity/upnp/mapping;"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/src/client;"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/src/hooks;"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/src/im;"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/src/media;"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/src/jamidht;"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/src/jamidht/eth;"
|
||||
PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/src;" "${CMAKE_CURRENT_SOURCE_DIR}/src/jami;"
|
||||
)
|
||||
|
||||
if(MSVC)
|
||||
################################################################################
|
||||
# Target
|
||||
################################################################################
|
||||
include("CMake/Utils.cmake")
|
||||
|
||||
add_library(${PROJECT_NAME} STATIC ${ALL_FILES})
|
||||
set_target_properties(${PROJECT_NAME} PROPERTIES FOLDER "daemon")
|
||||
|
||||
use_props(${PROJECT_NAME} "${CMAKE_CONFIGURATION_TYPES}" "${DEFAULT_CXX_PROPS}")
|
||||
|
||||
set_target_properties (${PROJECT_NAME} PROPERTIES CXX_STANDARD 17)
|
||||
|
||||
################################################################################
|
||||
# Include necessary .cmake file (need to init use_props first)
|
||||
################################################################################
|
||||
@ -94,7 +185,6 @@ if(MSVC)
|
||||
|
||||
# Supress generation of ZERO_CHECK
|
||||
set(CMAKE_SUPPRESS_REGENERATION true)
|
||||
|
||||
set(ROOT_NAMESPACE ringdaemon)
|
||||
|
||||
################################################################################
|
||||
@ -123,23 +213,6 @@ if(MSVC)
|
||||
################################################################################
|
||||
if("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x64")
|
||||
target_include_directories(${PROJECT_NAME} PUBLIC
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/.;"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/src;"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/src/client;"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/src/config;"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/src/connectivity;"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/src/connectivity/security;"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/src/connectivity/sip;"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/src/connectivity/upnp;"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/src/connectivity/upnp/igd;"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/src/connectivity/upnp/protocol;"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/src/connectivity/upnp/mapping;"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/src/jami;"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/src/hooks;"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/src/im;"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/src/media;"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/src/jamidht;"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/src/jamidht/eth;"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/compat/msvc;"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/contrib/msvc;"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/contrib/msvc/include;"
|
||||
@ -176,14 +249,12 @@ if(MSVC)
|
||||
if("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x64")
|
||||
target_compile_definitions(${PROJECT_NAME} PRIVATE
|
||||
"_WIN32_WINNT=0x0A00;"
|
||||
"ASIO_STANDALONE;"
|
||||
"STATIC_GETOPT;"
|
||||
"LIBARCHIVE_STATIC;"
|
||||
"OPENDHT_PROXY_CLIENT;"
|
||||
"OPENDHT_PROXY_SERVER;"
|
||||
"OPENDHT_PUSH_NOTIFICATIONS;"
|
||||
"NATPMP_STATICLIB;"
|
||||
"ENABLE_PLUGIN;"
|
||||
"NDEBUG;"
|
||||
"_USE_MATH_DEFINES;"
|
||||
"_SCL_SECURE_NO_WARNINGS;"
|
||||
@ -194,7 +265,6 @@ if(MSVC)
|
||||
"WEBRTC_WIN;"
|
||||
"WEBRTC_AUDIO_PROCESSING_ONLY_BUILD;"
|
||||
"WEBRTC_NS_FLOAT;"
|
||||
"MSGPACK_NO_BOOST;"
|
||||
)
|
||||
endif()
|
||||
|
||||
@ -287,5 +357,96 @@ if(MSVC)
|
||||
)
|
||||
|
||||
set ( CMAKE_STATIC_LINKER_FLAGS ${libAdditionalDependencies} )
|
||||
else()
|
||||
list(APPEND CMAKE_FIND_ROOT_PATH ${CONTRIB_PATH})
|
||||
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE BOTH)
|
||||
list(APPEND CMAKE_PREFIX_PATH ${CONTRIB_PATH})
|
||||
|
||||
find_package (jsoncpp REQUIRED)
|
||||
find_package (yaml-cpp REQUIRED)
|
||||
find_package (fmt REQUIRED)
|
||||
pkg_search_module (webrtcap REQUIRED IMPORTED_TARGET webrtc-audio-processing)
|
||||
pkg_search_module (gnutls REQUIRED IMPORTED_TARGET gnutls)
|
||||
pkg_search_module (opendht REQUIRED IMPORTED_TARGET opendht)
|
||||
pkg_search_module (git2 REQUIRED IMPORTED_TARGET libgit2)
|
||||
pkg_search_module (archive REQUIRED IMPORTED_TARGET libarchive)
|
||||
pkg_search_module (secp256k1 REQUIRED IMPORTED_TARGET libsecp256k1)
|
||||
pkg_search_module (pjproject REQUIRED IMPORTED_TARGET libpjproject)
|
||||
pkg_search_module (avformat REQUIRED IMPORTED_TARGET libavformat)
|
||||
pkg_search_module (avdevice REQUIRED IMPORTED_TARGET libavdevice)
|
||||
pkg_search_module (avfilter REQUIRED IMPORTED_TARGET libavfilter)
|
||||
pkg_search_module (avcodec REQUIRED IMPORTED_TARGET libavcodec)
|
||||
pkg_search_module (swresample REQUIRED IMPORTED_TARGET libswresample)
|
||||
pkg_search_module (swscale REQUIRED IMPORTED_TARGET libswscale)
|
||||
pkg_search_module (avutil REQUIRED IMPORTED_TARGET libavutil)
|
||||
|
||||
target_include_directories(${PROJECT_NAME} SYSTEM PUBLIC ${CONTRIB_PATH}/include)
|
||||
target_link_libraries(${PROJECT_NAME} PRIVATE
|
||||
PkgConfig::opendht
|
||||
PkgConfig::pjproject
|
||||
PkgConfig::git2
|
||||
PkgConfig::archive
|
||||
PkgConfig::gnutls
|
||||
PkgConfig::webrtcap
|
||||
PkgConfig::avformat
|
||||
PkgConfig::avdevice
|
||||
PkgConfig::avfilter
|
||||
PkgConfig::avcodec
|
||||
PkgConfig::swresample
|
||||
PkgConfig::swscale
|
||||
jsoncpp
|
||||
yaml-cpp
|
||||
fmt
|
||||
secp256k1
|
||||
PUBLIC
|
||||
PkgConfig::avutil
|
||||
)
|
||||
target_compile_options(${PROJECT_NAME} PRIVATE
|
||||
-fvisibility=hidden
|
||||
-Wall -Wextra
|
||||
-Wnon-virtual-dtor
|
||||
-Wno-deprecated
|
||||
-Wno-deprecated-declarations
|
||||
-Wno-unknown-pragmas
|
||||
)
|
||||
target_compile_definitions(${PROJECT_NAME} PRIVATE
|
||||
JAMI_DATADIR="${JAMI_DATADIR}"
|
||||
PJ_AUTOCONF=1
|
||||
)
|
||||
if (ANDROID)
|
||||
target_link_libraries(${PROJECT_NAME} PRIVATE OpenSLES log)
|
||||
endif()
|
||||
if (JAMI_NATPMP)
|
||||
target_link_libraries(${PROJECT_NAME} PRIVATE natpmp)
|
||||
endif()
|
||||
if (JAMI_PUPNP)
|
||||
target_link_libraries(${PROJECT_NAME} PRIVATE upnp)
|
||||
endif()
|
||||
|
||||
if (JAMI_JNI)
|
||||
# Generate swig binding
|
||||
add_custom_command(
|
||||
OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/bin/jni/jami_wrapper.cpp
|
||||
COMMAND env PACKAGEDIR=${JAMI_JNI_PACKAGEDIR} "./make-swig.sh"
|
||||
DEPENDS
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/bin/jni/make-swig.sh
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/bin/jni/jni_interface.i
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/bin/jni/callmanager.i
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/bin/jni/configurationmanager.i
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/bin/jni/conversation.i
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/bin/jni/managerimpl.i
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/bin/jni/data_view.i
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin/jni
|
||||
)
|
||||
# Build jni binding
|
||||
add_library(${PROJECT_NAME}-jni SHARED ${CMAKE_CURRENT_SOURCE_DIR}/bin/jni/jami_wrapper.cpp)
|
||||
target_link_directories(${PROJECT_NAME}-jni PRIVATE ${CONTRIB_PATH}/lib)
|
||||
target_link_libraries(${PROJECT_NAME}-jni ${PROJECT_NAME} android log)
|
||||
set_target_properties(${PROJECT_NAME}-jni PROPERTIES CXX_STANDARD 17)
|
||||
target_link_options(${PROJECT_NAME}-jni PRIVATE
|
||||
-Wl,-Bsymbolic
|
||||
-Wall -Wextra
|
||||
)
|
||||
endif()
|
||||
|
||||
endif()
|
||||
|
@ -37,17 +37,18 @@ if [[ $SWIGVER1 -lt 4 ]]; then
|
||||
exit 3
|
||||
fi
|
||||
|
||||
mkdir -p $PACKAGEDIR
|
||||
PACKAGE_PATH="$PACKAGEDIR/${PACKAGE//.//}"
|
||||
mkdir -p $PACKAGE_PATH
|
||||
|
||||
echo "Generating jami_wrapper.cpp..."
|
||||
echo "Generating jami_wrapper.cpp and java bindings to $PACKAGE_PATH"
|
||||
swig -v -c++ -java \
|
||||
-package $PACKAGE \
|
||||
-outdir $PACKAGEDIR \
|
||||
-outdir $PACKAGE_PATH \
|
||||
-o $JNIDIR/jami_wrapper.cpp $JNIDIR/jni_interface.i
|
||||
|
||||
echo "Generating jamiservice_loader.c..."
|
||||
python $JNIDIR/JavaJNI2CJNI_Load.py \
|
||||
-i $PACKAGEDIR/JamiServiceJNI.java \
|
||||
-i $PACKAGE_PATH/JamiServiceJNI.java \
|
||||
-o $JNIDIR/jamiservice_loader.c \
|
||||
-t $JNIDIR/jamiservice.c.template \
|
||||
-m JamiService \
|
||||
|
Reference in New Issue
Block a user