From 836b641bffaa667ca005ac3d63ca51da7b052e70 Mon Sep 17 00:00:00 2001 From: Ben Doherty Date: Tue, 29 Jan 2019 12:34:04 -0700 Subject: [PATCH] Add filamat-jni to CMake and build.sh (#740) --- CMakeLists.txt | 26 +++-- android/filamat-android/CMakeLists.txt | 95 +++++++++++++++++++ android/filamat-android/libfilamat-jni.map | 4 + .../filamat-android/libfilamat-jni.symbols | 1 + build.sh | 41 +++++++- third_party/spirv-cross/tnt/CMakeLists.txt | 1 + 6 files changed, 160 insertions(+), 8 deletions(-) create mode 100644 android/filamat-android/CMakeLists.txt create mode 100644 android/filamat-android/libfilamat-jni.map create mode 100644 android/filamat-android/libfilamat-jni.symbols diff --git a/CMakeLists.txt b/CMakeLists.txt index e09c0ab310f..89e17f6d511 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -236,6 +236,14 @@ if (FILAMENT_SUPPORTS_METAL) add_definitions(-DFILAMENT_SUPPORTS_METAL) endif() +# Building filamat increases build times and isn't required for non-desktop platforms, so turn it +# off by default. +if (NOT ANDROID AND NOT WEBGL AND NOT IOS) + option(FILAMENT_BUILD_FILAMAT "Build filamat and JNI buildings" ON) +else() + option(FILAMENT_BUILD_FILAMAT "Build filamat and JNI buildings" OFF) +endif() + # ================================================================================================== # Distribution # ================================================================================================== @@ -323,6 +331,7 @@ endfunction() # ================================================================================================== # Sub-projects # ================================================================================================== + # Common to all platforms add_subdirectory(${EXTERNAL}/libgtest/tnt) add_subdirectory(${LIBRARIES}/filabridge) @@ -338,6 +347,16 @@ add_subdirectory(${EXTERNAL}/smol-v/tnt) add_subdirectory(${EXTERNAL}/benchmark/tnt) add_subdirectory(${EXTERNAL}/meshoptimizer) +if (FILAMENT_BUILD_FILAMAT) + # spirv-tools must come before filamat, as filamat relies on the presence of the + # spirv-tools_SOURCE_DIR variable. + add_subdirectory(${EXTERNAL}/spirv-tools) + add_subdirectory(${EXTERNAL}/glslang/tnt) + add_subdirectory(${EXTERNAL}/spirv-cross/tnt) + add_subdirectory(android/filamat-android) + add_subdirectory(${LIBRARIES}/filamat) +endif() + if (FILAMENT_SUPPORTS_VULKAN) add_subdirectory(${LIBRARIES}/bluevk) add_subdirectory(${EXTERNAL}/vkmemalloc/tnt) @@ -359,15 +378,8 @@ if (WEBGL) endif() if (NOT ANDROID AND NOT WEBGL AND NOT IOS) - # spirv-tools must come before filamat, as filamat relies on the presence of the - # spirv-tools_SOURCE_DIR variable. - add_subdirectory(${EXTERNAL}/spirv-tools) - add_subdirectory(${EXTERNAL}/glslang/tnt) - add_subdirectory(${EXTERNAL}/spirv-cross/tnt) - add_subdirectory(${LIBRARIES}/bluegl) add_subdirectory(${LIBRARIES}/filagui) - add_subdirectory(${LIBRARIES}/filamat) add_subdirectory(${LIBRARIES}/imageio) add_subdirectory(${FILAMENT}/java) diff --git a/android/filamat-android/CMakeLists.txt b/android/filamat-android/CMakeLists.txt new file mode 100644 index 00000000000..b979f991e44 --- /dev/null +++ b/android/filamat-android/CMakeLists.txt @@ -0,0 +1,95 @@ +cmake_minimum_required(VERSION 3.4.1) +project(filamat-java) + +if (NOT ENABLE_JAVA) + return() +endif() + +find_package(Java) +if (NOT Java_FOUND) + message(WARNING "JDK not found, skipping Java projects") + return() +endif() + +# Android already has the JNI headers in its system include path. +if (NOT ANDROID) + find_package(JNI) + if (NOT JNI_FOUND) + message(WARNING "JNI not found, skipping Java projects") + return() + endif() +endif() + +if (NOT DEFINED ENV{JAVA_HOME}) + message(WARNING "The JAVA_HOME environment variable must be set to compile Java projects") + message(WARNING "Skipping Java projects") + return() +endif() + +# ================================================================================================== +# JNI bindings +# ================================================================================================== +set(TARGET filamat-jni) + +set(JNI_SOURCE_FILES + src/main/cpp/MaterialBuilder.cpp) + +add_library(${TARGET} SHARED ${JNI_SOURCE_FILES}) + +target_include_directories(${TARGET} PRIVATE ${JNI_INCLUDE_DIRS}) + +set(EXPORTED_SYMBOLS) +if (APPLE) + set(EXPORTED_SYMBOLS "-exported_symbols_list ${CMAKE_CURRENT_SOURCE_DIR}/libfilamat-jni.symbols") +elseif (ANDROID) + set(EXPORTED_SYMBOLS "-Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/libfilamat-jni.map") +endif() + +# This is necessary to avoid a CMake error due to setting RPATH on non-elf platforms. +# Setting this also causes CMake to issue a warning on Mac: +# "Policy CMP0068 is not set: RPATH settings on macOS do not affect install_name." which can be +# safely ignored. +set(CMAKE_SKIP_RPATH TRUE) + +set_target_properties(${TARGET} PROPERTIES + CXX_STANDARD 14 + COMPILE_FLAGS "-fno-exceptions -fvisibility=hidden" + LINK_FLAGS "${GC_SECTIONS} ${EXPORTED_SYMBOLS}") + +target_compile_options(${TARGET} PRIVATE + $<$:-fPIC> +) + +target_link_libraries(${TARGET} filamat) + +set(INSTALL_TYPE LIBRARY) +if (WIN32 OR CYGWIN) + set(INSTALL_TYPE RUNTIME) +endif() +install(TARGETS ${TARGET} ${INSTALL_TYPE} DESTINATION lib/${DIST_DIR}) +install(CODE "execute_process(COMMAND ${CMAKE_STRIP} -x ${CMAKE_INSTALL_PREFIX}/lib/${DIST_DIR}/lib${TARGET}${CMAKE_SHARED_LIBRARY_SUFFIX})") + +# ================================================================================================== +# Java APIs +# ================================================================================================== + +# Android builds its Java bindings for filamat through Gradle. +if (ANDROID) + return() +endif() + +set(TARGET filamat-java) + +include(UseJava) + +set(CMAKE_JAVA_COMPILE_FLAGS "-source" "1.8" "-target" "1.8") + +set(JAVA_SOURCE_FILES + src/main/java/com/google/android/filament/filamat/MaterialBuilder.java + src/main/java/com/google/android/filament/filamat/MaterialPackage.java) + +add_jar(${TARGET} + SOURCES ${JAVA_SOURCE_FILES} + INCLUDE_JARS ../../java/lib/support-annotations.jar) + +install_jar(${TARGET} lib) diff --git a/android/filamat-android/libfilamat-jni.map b/android/filamat-android/libfilamat-jni.map new file mode 100644 index 00000000000..925999d3b7e --- /dev/null +++ b/android/filamat-android/libfilamat-jni.map @@ -0,0 +1,4 @@ +LIBFILAMAT { + global: Java_com_google_android_filament_*; JNI*; + local: *; +}; diff --git a/android/filamat-android/libfilamat-jni.symbols b/android/filamat-android/libfilamat-jni.symbols new file mode 100644 index 00000000000..7b079c4ad9c --- /dev/null +++ b/android/filamat-android/libfilamat-jni.symbols @@ -0,0 +1 @@ +_Java_com_google_android_filament_* diff --git a/build.sh b/build.sh index a07314618f3..2a98a51279d 100755 --- a/build.sh +++ b/build.sh @@ -41,6 +41,8 @@ function print_help { echo " Add Vulkan support to the Android build." echo " -s" echo " Add iOS simulator support to the iOS build." + echo " -l" + echo " Add filamat support to the Android build." echo "" echo "Build types:" echo " release" @@ -100,6 +102,9 @@ GENERATE_TOOLCHAINS=false VULKAN_ANDROID_OPTION="-DFILAMENT_SUPPORTS_VULKAN=OFF" +BUILD_FILAMAT_ANDROID=false +FILAMAT_ANDROID_OPTION="-DFILAMENT_BUILD_FILAMAT=OFF" + IOS_BUILD_SIMULATOR=false BUILD_GENERATOR=Ninja @@ -298,6 +303,7 @@ function build_android_target { -DCMAKE_INSTALL_PREFIX=../android-${LC_TARGET}/filament \ -DCMAKE_TOOLCHAIN_FILE=../../build/toolchain-${ARCH}-linux-android.cmake \ $VULKAN_ANDROID_OPTION \ + $FILAMAT_ANDROID_OPTION \ ../.. fi @@ -382,6 +388,33 @@ function build_android { fi cd ../.. + + + if [ "$BUILD_FILAMAT_ANDROID" == "true" ]; then + + cd android/filamat-android + + if [ "$ISSUE_DEBUG_BUILD" == "true" ]; then + ./gradlew -Pfilament_dist_dir=../../out/android-debug/filament assembleDebug + + if [ "$INSTALL_COMMAND" ]; then + echo "Installing out/filamat-android-debug.aar..." + cp build/outputs/aar/filamat-android-debug.aar ../../out/ + fi + fi + + if [ "$ISSUE_RELEASE_BUILD" == "true" ]; then + ./gradlew -Pfilament_dist_dir=../../out/android-release/filament assembleRelease + + if [ "$INSTALL_COMMAND" ]; then + echo "Installing out/filamat-android-release.aar..." + cp build/outputs/aar/filamat-android-release.aar ../../out/ + fi + fi + + cd ../.. + + fi } function ensure_ios_toolchain { @@ -545,7 +578,7 @@ function run_tests { pushd `dirname $0` > /dev/null -while getopts ":hacfijmp:tuvs" opt; do +while getopts ":hacfijmp:tuvsl" opt; do case ${opt} in h) print_help @@ -615,6 +648,12 @@ while getopts ":hacfijmp:tuvs" opt; do echo "Also be sure to pass Engine.Backend.VULKAN to Engine.create." echo "" ;; + l) + FILAMAT_ANDROID_OPTION="-DFILAMENT_BUILD_FILAMAT=ON" + BUILD_FILAMAT_ANDROID=true + echo "Building filamat JNI library for Android." + echo "" + ;; s) IOS_BUILD_SIMULATOR=true echo "iOS simulator support enabled." diff --git a/third_party/spirv-cross/tnt/CMakeLists.txt b/third_party/spirv-cross/tnt/CMakeLists.txt index 2b0816b4842..9ab6d71c595 100644 --- a/third_party/spirv-cross/tnt/CMakeLists.txt +++ b/third_party/spirv-cross/tnt/CMakeLists.txt @@ -65,6 +65,7 @@ macro(spirv_cross_add_library name config_name) target_compile_options(${name} PRIVATE ${spirv-compiler-options}) target_compile_definitions(${name} PRIVATE ${spirv-compiler-defines}) target_compile_definitions(${name} PUBLIC ${spirv-compiler-public-defines}) + target_compile_options(${name} PRIVATE $<$:-fPIC>) endmacro() spirv_cross_add_library(spirv-cross-core spirv_cross_core STATIC