[Android] buildsystem: use CMake to build libmla.so (medialibrary)
Steve Lhomme
git at videolan.org
Fri May 29 09:44:22 UTC 2026
vlc-android | branch: master | Steve Lhomme <robux4 at ycbcr.xyz> | Fri Jun 20 08:15:48 2025 +0200| [927e7ded6c8d8ffe7fed66e37565dc68ee9eabab] | committer: Steve Lhomme
buildsystem: use CMake to build libmla.so (medialibrary)
This is easier to integrate with Gradle since we can add some logic
in the CMake file.
> https://code.videolan.org/videolan/vlc-android/commit/927e7ded6c8d8ffe7fed66e37565dc68ee9eabab
---
buildsystem/compile-medialibrary.sh | 26 ++++++-----------
buildsystem/compile.sh | 2 +-
medialibrary/jni/Android.mk | 19 -------------
medialibrary/jni/CMakeLists.txt | 56 +++++++++++++++++++++++++++++++++++++
4 files changed, 65 insertions(+), 38 deletions(-)
diff --git a/buildsystem/compile-medialibrary.sh b/buildsystem/compile-medialibrary.sh
index 8104912069..edbd2ba49f 100755
--- a/buildsystem/compile-medialibrary.sh
+++ b/buildsystem/compile-medialibrary.sh
@@ -41,7 +41,7 @@ else
fi
SRC_DIR=$PWD
-# gets TARGET_TUPLE / ANDROID_API / CLANG_PREFIX / CROSS_CLANG / VLC_CFLAGS / VLC_CXXFLAGS / NDK_DEBUG / MAKEFLAGS / LIBVLCJNI_SRC_DIR
+# gets TARGET_TUPLE / ANDROID_API / CLANG_PREFIX / CROSS_CLANG / VLC_CFLAGS / VLC_CXXFLAGS / MAKEFLAGS / LIBVLCJNI_SRC_DIR
AVLC_SOURCED=1 . libvlcjni/buildsystem/compile-libvlc.sh
################
@@ -143,9 +143,11 @@ cd ${SRC_DIR}
if [ "$RELEASE" = "1" ]; then
MEDIALIBRARY_NDEBUG=true
MEDIALIBRARY_OPTIMIZATION=3
+ CMAKE_DEBUG=RelWithDebInfo
else
MEDIALIBRARY_NDEBUG=false
MEDIALIBRARY_OPTIMIZATION=0
+ CMAKE_DEBUG=Debug
fi
cd ${MEDIALIBRARY_BUILD_DIR}
@@ -225,22 +227,10 @@ avlc_checkfail "medialibrary: build failed"
cd ${SRC_DIR}
-MEDIALIBRARY_LDLIBS="-L$LIBVLCJNI_SRC_DIR/libvlc/jni/libs/${ANDROID_ABI}/ -lvlc \
--L$LIBVLCJNI_SRC_DIR/vlc/contrib/$TARGET_TUPLE/lib -ljpeg \
--lc++abi"
-
-$NDK_BUILD -C medialibrary \
- APP_STL="$NDK_APP_STL" \
- LOCAL_CPP_FEATURES="rtti exceptions" \
- LOCAL_LDFLAGS="-Wl,-z,max-page-size=16384" \
- APP_BUILD_SCRIPT=jni/Android.mk \
- APP_PLATFORM=android-${ANDROID_API} \
- APP_ABI=${ANDROID_ABI} \
- NDK_PROJECT_PATH=jni \
- NDK_TOOLCHAIN_VERSION=clang \
- MEDIALIBRARY_LDLIBS="${MEDIALIBRARY_LDLIBS}" \
- MEDIALIBRARY_INCLUDE_DIR=${MEDIALIBRARY_BUILD_DIR}/include \
- NDK_DEBUG=${NDK_DEBUG} \
- SQLITE_RELEASE=$SQLITE_RELEASE
+cmake -S medialibrary/jni -B medialibrary/medialibrary/mla/android-${ANDROID_API}-${ANDROID_ABI} \
+ -DCMAKE_TOOLCHAIN_FILE=${ANDROID_NDK}/build/cmake/android.toolchain.cmake \
+ -DANDROID_ABI=${ANDROID_ABI} -DANDROID_PLATFORM=android-${ANDROID_API} -DCMAKE_BUILD_TYPE=${CMAKE_DEBUG} -DANDROID_STL=${NDK_APP_STL} \
+ -DLIBVLCJNI_SRC_DIR:PATH=${LIBVLCJNI_SRC_DIR}
+cmake --build medialibrary/medialibrary/mla/android-${ANDROID_API}-${ANDROID_ABI}
avlc_checkfail "nkd-build medialibrary failed"
diff --git a/buildsystem/compile.sh b/buildsystem/compile.sh
index 20fe046098..c57b8b2a48 100755
--- a/buildsystem/compile.sh
+++ b/buildsystem/compile.sh
@@ -402,7 +402,7 @@ if [ "$NO_ML" != 1 ]; then
medialig_args="$medialig_args --reset"
fi
buildsystem/compile-medialibrary.sh ${medialig_args}
- cp -a medialibrary/jni/obj/local/${ANDROID_ABI}/*.so "${OUT_DBG_DIR}"
+ cp -a medialibrary/jni/libs/${ANDROID_ABI}/*.so "${OUT_DBG_DIR}"
fi
##################
diff --git a/medialibrary/jni/Android.mk b/medialibrary/jni/Android.mk
deleted file mode 100644
index 2316034e59..0000000000
--- a/medialibrary/jni/Android.mk
+++ /dev/null
@@ -1,19 +0,0 @@
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := medialibrary
-LOCAL_SRC_FILES := ../prefix/${APP_PLATFORM}-${APP_ABI}/lib/libmedialibrary.a
-include $(PREBUILT_STATIC_LIBRARY)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := sqlite
-LOCAL_SRC_FILES := ../prefix/${APP_PLATFORM}-${APP_ABI}/lib/libsqlite3.a
-include $(PREBUILT_STATIC_LIBRARY)
-
-include $(CLEAR_VARS)
-LOCAL_SRC_FILES := medialibrary.cpp AndroidMediaLibrary.cpp AndroidDeviceLister.cpp utils.cpp
-LOCAL_MODULE := mla
-LOCAL_LDLIBS := $(MEDIALIBRARY_LDLIBS) -llog
-LOCAL_C_INCLUDES := $(MEDIALIBRARY_INCLUDE_DIR)
-LOCAL_STATIC_LIBRARIES := medialibrary sqlite
-include $(BUILD_SHARED_LIBRARY)
diff --git a/medialibrary/jni/CMakeLists.txt b/medialibrary/jni/CMakeLists.txt
new file mode 100644
index 0000000000..578ee2ab7d
--- /dev/null
+++ b/medialibrary/jni/CMakeLists.txt
@@ -0,0 +1,56 @@
+cmake_minimum_required(VERSION 3.21) # proper support with the NDK
+
+project(medialibrary)
+
+set(CMAKE_C_STANDARD 17)
+set(CMAKE_CXX_STANDARD 17)
+
+set(ANDROID_CPP_FEATURES "rtti exceptions")
+
+set(LIBVLCJNI_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../libvlcjni" CACHE PATH "libvlcjni base directory")
+set(PREBUILT_PREFIX "${CMAKE_CURRENT_SOURCE_DIR}/../prefix/${ANDROID_PLATFORM}-${ANDROID_ABI}")
+if(NOT CMAKE_LIBRARY_OUTPUT_DIRECTORY)
+ set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/libs/${ANDROID_NDK_ABI_NAME}")
+endif()
+
+# prebuilt binaries
+## built with bash script (for now)
+add_library(libvlc STATIC IMPORTED)
+set_target_properties(libvlc
+ PROPERTIES IMPORTED_LOCATION
+ ${LIBVLCJNI_SRC_DIR}/libvlc/jni/libs/${ANDROID_NDK_ABI_NAME}/libvlc.so)
+
+## built with meson script (cannot be called by gradle but could be called by CMake)
+add_library(medialibrary STATIC IMPORTED)
+set_target_properties(medialibrary
+ PROPERTIES IMPORTED_LOCATION
+ ${PREBUILT_PREFIX}/lib/libmedialibrary.a)
+
+## built with bash script
+add_library(sqlite STATIC IMPORTED)
+set_target_properties(sqlite
+ PROPERTIES IMPORTED_LOCATION
+ ${PREBUILT_PREFIX}/lib/libsqlite3.a)
+
+find_library(MATH_LIB m)
+find_library(LOG_LIB log)
+
+# mla
+add_library(mla SHARED
+ ${CMAKE_CURRENT_SOURCE_DIR}/medialibrary.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/AndroidMediaLibrary.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/AndroidDeviceLister.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/utils.cpp)
+
+target_link_options(mla PRIVATE "-Wl,-z,max-page-size=16384")
+target_link_libraries(mla libvlc medialibrary sqlite ${MATH_LIB} ${LOG_LIB})
+target_include_directories(mla PRIVATE ${PREBUILT_PREFIX}/include)
+
+if (${CMAKE_ANDROID_STL_TYPE} STREQUAL "c++_shared")
+ # Copy the C++ runtime
+ add_custom_command(TARGET mla PRE_BUILD
+ COMMAND ${CMAKE_COMMAND} -E copy_if_different
+ ${ANDROID_TOOLCHAIN_ROOT}/sysroot/usr/lib/${CMAKE_LIBRARY_ARCHITECTURE}/libc++_shared.so
+ "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}")
+endif()
+
More information about the Android
mailing list