[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