Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • Aza/libvlcjni
  • Skantes/libvlcjni
  • videolan/libvlcjni
  • mfkl/libvlcjni
  • tguillem/libvlcjni
  • chouquette/libvlcjni
  • asenat/libvlcjni
  • aaa1115910/libvlcjni
  • alexandre-janniaux/libvlcjni
  • robUx4/libvlcjni
  • fcartegnie/libvlcjni
  • Labnann/libvlcjni
  • c0ff330k/libvlcjni
  • haasn/libvlcjni
  • Niram7777/libvlcjni
  • chub/libvlcjni
  • fhuber/libvlcjni
  • MangalK/libvlcjni
  • gabriel_lt/libvlcjni
  • rhstone/libvlcjni
  • sami-sweng/libvlcjni
  • rschneider/libvlcjni
22 results
Show changes
Commits on Source (137)
Showing
with 1275 additions and 852 deletions
# Local configuration
local.properties
env.sh
#Android Studio
.idea
*.iml
#gradle
gradlew.bat
gradlew
gradle*/
.gradle/
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
ext.android_plugin_version = '7.1.2'
ext.kotlin_version = '1.6.10'
ext.kotlinx_version = '1.6.0'
ext.android_plugin_version = '7.3.1'
repositories {
flatDir dirs: "gradle/plugins"
google()
......@@ -11,9 +9,8 @@ buildscript {
}
dependencies {
classpath "com.android.tools.build:gradle:$android_plugin_version"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1'
classpath 'com.vanniktech:gradle-maven-publish-plugin:0.14.2'
classpath 'com.vanniktech:gradle-maven-publish-plugin:0.25.2'
}
}
......@@ -22,68 +19,13 @@ allprojects {
google()
mavenCentral()
}
tasks.withType(Javadoc) {
// Ignores errors from mavenAndroidJavadocs task
// (reference: github.com/novoda/bintray-release/issues/71#issuecomment-164324255)
options.addStringOption('Xdoclint:none', '-quiet')
options.addStringOption('encoding', 'UTF-8')
}
}
ext {
appId = "org.videolan.vlc"
versionName = '3.5.0 Beta 3'
versionCode = 3040430
libvlcVersion = '3.5.0-eap5'
medialibraryVersion = '0.11.1-eap5'
libvlcVersion = '4.0.0-eap19'
minSdkVersion = 17
targetSdkVersion = 30
compileSdkVersion = 31
androidxLegacyVersion = '1.0.0'
androidxCoreVersion = '1.7.0'
appCompatVersion = '1.4.1'
lifecycleVersion = '2.4.0'
androidxPreferencesVersion = '1.1.1'
androidxVersion = '1.1.0'
androidxActivityVersion = '1.4.0'
androidxFragmentVersion = '1.4.1'
androidxAnnotationVersion = '1.3.0'
androidxRecyclerviewVersion = '1.2.1'
androidxMediaVersion = '1.1.0'
androidxLeanbackVersion = '1.0.0'
androidxMaterialVersion = '1.5.0'
constraintLayoutVersion = '2.1.3'
viewPager2Version = "1.0.0"
archVersion = '2.1.0'
roomVersion = '2.4.1'
pagingVersion = '3.1.0'
junitVersion = '4.13.2'
mockito = '2.25.0'
//Retrofit 2.7 drops Android 5 support
retrofit = '2.7.1'
moshi = '1.8.0'
powerMock = '2.0.2'
espressoVersion = '3.4.0'
livedataTest = '1.2.0'
robolectric = '4.3.1'
mockk = '1.9.3'
supportTest = '1.1.3'
orchestrator = '1.1.0'
testCore = '1.4.0'
// versionCode scheme is T M NN RR AA
// T: Target/Flavour (1 for Android, 2 for Chrome?)
// M: Major version from 0 to 9
// NN: Minor version from 00 to 99
// RR: Micro/Revision version from 00 to 99
// AA: ABI from 0 to 99
// 0 is dev
// 1 was ARMv5 (deprecated)
// 2 was ARMv6-nofpu (deprecated)
// 3 was ARMv6-fpu (deprecated)
// 4 is ARMv7-A
// 5 is x86
// 6 is MIPS
// 7 is ARMv8
// 8 is x86_64
// 9 is MIPS64
}
#!/bin/sh
set -e
#############
# ARGUMENTS #
#############
AVLC_RELEASE=$RELEASE
# Indicated if prebuilt contribs package
# should be created
AVLC_MAKE_PREBUILT_CONTRIBS=0
# Indicates that prebuit contribs should be
# used instead of building the contribs from source
AVLC_USE_PREBUILT_CONTRIBS=0
while [ $# -gt 0 ]; do
case $1 in
help|--help)
echo "Use -a to set the ARCH"
echo "Use --release to build in release mode"
exit 1
;;
a|-a)
ANDROID_ABI=$2
shift
;;
release|--release)
AVLC_RELEASE=1
;;
--package-contribs)
AVLC_MAKE_PREBUILT_CONTRIBS=1
;;
--with-prebuilt-contribs)
AVLC_USE_PREBUILT_CONTRIBS=1
;;
esac
shift
done
# Validate arguments
if [ "$AVLC_MAKE_PREBUILT_CONTRIBS" -gt "0" ] &&
[ "$AVLC_USE_PREBUILT_CONTRIBS" -gt "0" ]; then
echo >&2 "ERROR: The --package-contribs and --with-prebuilt-contribs options"
echo >&2 " can not be used together."
exit 1
fi
# Make in //
if [ -z "$MAKEFLAGS" ]; then
UNAMES=$(uname -s)
MAKEFLAGS=
if which nproc >/dev/null; then
MAKEFLAGS=-j$(nproc)
elif [ "$UNAMES" = "Darwin" ] && which sysctl >/dev/null; then
MAKEFLAGS=-j$(sysctl -n machdep.cpu.thread_count)
fi
fi
#########
# FLAGS #
#########
if [ "${ANDROID_ABI}" = "arm" ] ; then
ANDROID_ABI="armeabi-v7a"
elif [ "${ANDROID_ABI}" = "arm64" ] ; then
ANDROID_ABI="arm64-v8a"
fi
# Set up ABI variables
if [ "${ANDROID_ABI}" = "x86" ] ; then
TARGET_TUPLE="i686-linux-android"
CLANG_PREFIX=${TARGET_TUPLE}
elif [ "${ANDROID_ABI}" = "x86_64" ] ; then
TARGET_TUPLE="x86_64-linux-android"
CLANG_PREFIX=${TARGET_TUPLE}
elif [ "${ANDROID_ABI}" = "arm64-v8a" ] ; then
TARGET_TUPLE="aarch64-linux-android"
CLANG_PREFIX=${TARGET_TUPLE}
elif [ "${ANDROID_ABI}" = "armeabi-v7a" ] ; then
TARGET_TUPLE="arm-linux-androideabi"
CLANG_PREFIX="armv7a-linux-androideabi"
else
echo "Please pass the ANDROID ABI to the correct architecture, using
build-libvlc.sh -a ARCH
ARM: (armeabi-v7a|arm)
ARM64: (arm64-v8a|arm64)
X86: x86, x86_64"
exit 1
fi
# try to detect NDK version
REL=$(grep -o '^Pkg.Revision.*[0-9]*.*' $ANDROID_NDK/source.properties |cut -d " " -f 3 | cut -d "." -f 1)
if [ "$REL" = 27 ]; then
ANDROID_API=21
else
echo "NDK v27 needed, got $REL, cf. https://developer.android.com/ndk/downloads/"
exit 1
fi
############
# VLC PATH #
############
LIBVLCJNI_ROOT="$(cd "$(dirname "$0")/.."; pwd -P)"
# Fix path if the script is sourced from vlc-android
if [ -d $LIBVLCJNI_ROOT/libvlcjni ];then
LIBVLCJNI_ROOT=$LIBVLCJNI_ROOT/libvlcjni
fi
if [ -f $LIBVLCJNI_ROOT/src/libvlc.h ];then
VLC_SRC_DIR="$LIBVLCJNI_ROOT"
elif [ -f $PWD/src/libvlc.h ];then
VLC_SRC_DIR="$PWD"
elif [ -d $LIBVLCJNI_ROOT/vlc ];then
VLC_SRC_DIR=$LIBVLCJNI_ROOT/vlc
else
echo "Could not find vlc sources"
exit 1
fi
VLC_BUILD_DIR="$(cd $VLC_SRC_DIR/; pwd)/build-android-${TARGET_TUPLE}"
if [ -z $VLC_TARBALLS ]; then
VLC_TARBALLS="$(cd $VLC_SRC_DIR/;pwd)/contrib/tarballs"
fi
if [ ! -d $VLC_TARBALLS ]; then
mkdir -p $VLC_TARBALLS
fi
VLC_OUT_PATH="$VLC_BUILD_DIR/ndk"
mkdir -p $VLC_OUT_PATH
#################
# NDK TOOLCHAIN #
#################
host_tag=""
case $(uname | tr '[:upper:]' '[:lower:]') in
linux*) host_tag="linux" ;;
darwin*) host_tag="darwin" ;;
msys*) host_tag="windows" ;;
*) echo "host OS not handled"; exit 1 ;;
esac
NDK_TOOLCHAIN_DIR=${ANDROID_NDK}/toolchains/llvm/prebuilt/${host_tag}-x86_64
NDK_TOOLCHAIN_PATH=${NDK_TOOLCHAIN_DIR}/bin
# Add the NDK toolchain to the PATH, needed both for contribs and for building
# stub libraries
CROSS_TOOLS=${NDK_TOOLCHAIN_PATH}/llvm-
CROSS_CLANG=${NDK_TOOLCHAIN_PATH}/${CLANG_PREFIX}${ANDROID_API}-clang
export PATH="${NDK_TOOLCHAIN_PATH}:${PATH}"
NDK_BUILD=$ANDROID_NDK/ndk-build
if [ ! -z "$MSYSTEM_PREFIX" ] ; then
# The make.exe and awk.exe from the toolchain don't work in msys
export PATH="$MSYSTEM_PREFIX/bin:/usr/bin:${NDK_TOOLCHAIN_PATH}:${PATH}"
NDK_BUILD=$NDK_BUILD.cmd
fi
##########
# CFLAGS #
##########
if [ "$NO_OPTIM" = "1" ];
then
VLC_CFLAGS="-g -O0"
else
VLC_CFLAGS="-g -O2"
fi
# cf. GLOBAL_CFLAGS from ${ANDROID_NDK}/build/core/default-build-commands.mk
VLC_CFLAGS="${VLC_CFLAGS} -fPIC -fdata-sections -ffunction-sections -funwind-tables \
-fstack-protector-strong -no-canonical-prefixes"
VLC_CXXFLAGS="-fexceptions -frtti"
# Release or not?
if [ "$AVLC_RELEASE" = 1 ]; then
VLC_CFLAGS="${VLC_CFLAGS} -DNDEBUG "
NDK_DEBUG=0
else
NDK_DEBUG=1
fi
###############
# DISPLAY ABI #
###############
echo "ABI: $ANDROID_ABI"
echo "API: $ANDROID_API"
echo "PATH: $PATH"
echo "VLC_CFLAGS: ${VLC_CFLAGS}"
echo "VLC_CXXFLAGS: ${VLC_CXXFLAGS}"
if [ -z "$ANDROID_NDK" ]; then
echo "Please set the ANDROID_NDK environment variable with its path."
exit 1
fi
if [ -z "$ANDROID_ABI" ]; then
echo "Please pass the ANDROID ABI to the correct architecture, using
build-libvlc.sh -a ARCH
ARM: (armeabi-v7a|arm)
ARM64: (arm64-v8a|arm64)
X86: x86, x86_64"
exit 1
fi
avlc_checkfail()
{
if [ ! $? -eq 0 ];then
echo "$1"
exit 1
fi
}
avlc_find_modules()
{
echo "$(find $1 -name 'lib*plugin.a' | grep -vE "lib(${blacklist_regexp})_plugin.a" | tr '\n' ' ')"
}
avlc_get_symbol()
{
echo "$1" | grep vlc_entry_$2|cut -d" " -f 3
}
avlc_gen_pc_file()
{
echo -n "Generating $2 pkg-config file: "
echo $1/$(echo $2|tr 'A-Z' 'a-z').pc
exec 3<> $1/$(echo $2|tr 'A-Z' 'a-z').pc
[ ! -z "${PC_PREFIX}" ] &&
echo "prefix=${PC_PREFIX}" >&3
[ ! -z "${PC_LIBDIR}" ] &&
echo "libdir=${PC_LIBDIR}" >&3
[ ! -z "${PC_INCLUDEDIR}" ] &&
echo "includedir=${PC_INCLUDEDIR}" >&3
echo "" >&3
echo "Name: $2" >&3
echo "Description: $2" >&3
echo "Version: $3" >&3
echo "Libs: ${PC_LIBS} -l$2" >&3
echo "Cflags: ${PC_CFLAGS}" >&3
exec 3>&-
}
avlc_pkgconfig()
{
# Enforce pkg-config files coming from VLC contribs
PKG_CONFIG_PATH="$VLC_CONTRIB/lib/pkgconfig/" \
PKG_CONFIG_LIBDIR="$VLC_CONTRIB/lib/pkgconfig/" \
pkg-config "$@"
}
avlc_build()
{
###########################
# VLC BOOTSTRAP ARGUMENTS #
###########################
VLC_CONTRIB_ARGS="\
--disable-aribb24 \
--disable-aribb25 \
--disable-caca \
--disable-chromaprint \
--disable-faad2 \
--disable-fontconfig \
--disable-goom \
--disable-kate \
--disable-libmpeg2 \
--disable-mad \
--disable-medialibrary \
--disable-mpcdec \
--disable-rav1e \
--disable-samplerate \
--disable-schroedinger \
--disable-sidplay2 \
--disable-srt \
--disable-vnc \
--disable-vncclient \
--disable-x265 \
--enable-ad-clauses \
--enable-dvdnav \
--enable-dvdread \
--enable-fluidlite \
--enable-gme \
--enable-harfbuzz \
--enable-jpeg \
--enable-libarchive \
--enable-libdsm \
--enable-libplacebo \
--enable-lua \
--enable-microdns \
--enable-mpg123 \
--enable-nfs \
--enable-smb2 \
--enable-soxr \
--enable-upnp \
--enable-vorbis \
--enable-vpx \
--enable-zvbi \
"
###########################
# VLC CONFIGURE ARGUMENTS #
###########################
VLC_CONFIGURE_ARGS="\
--disable-alsa \
--disable-caca \
--disable-dbus \
--disable-decklink \
--disable-dv1394 \
--disable-faad \
--disable-fluidsynth \
--disable-goom \
--disable-jack \
--disable-libva \
--disable-linsys \
--disable-mad \
--disable-mtp \
--disable-nls \
--disable-notify \
--disable-projectm \
--disable-pulse \
--disable-qt \
--disable-samplerate \
--disable-schroedinger \
--disable-shared \
--disable-sid \
--disable-skins2 \
--disable-svg \
--disable-udev \
--disable-update-check \
--disable-v4l2 \
--disable-vcd \
--disable-vlc \
--disable-vlm \
--disable-vnc \
--disable-xcb \
--enable-avcodec \
--enable-avformat \
--enable-bluray \
--enable-chromecast \
--enable-dvbpsi \
--enable-dvdnav \
--enable-dvdread \
--enable-fluidlite \
--enable-gles2 \
--enable-gme \
--enable-jpeg \
--enable-libass \
--enable-libxml2 \
--enable-live555 \
--enable-lua \
--enable-matroska \
--enable-mod \
--enable-mpg123 \
--enable-opensles \
--enable-opus \
--enable-smb2 \
--enable-sout \
--enable-swscale \
--enable-taglib \
--enable-vorbis \
--enable-zvbi \
--with-pic \
"
########################
# VLC MODULE BLACKLIST #
########################
VLC_MODULE_BLACKLIST="
access_(bd|shm|imem)
addons.*
alphamask
aout_file
audiobargraph_[av]
audioscrobbler
ball
blendbench
bluescreen
clone
dtstofloat32
dynamicoverlay
erase
export
fb
gestures
gradient
grain
hotkeys
logger
magnify
mediadirs
mirror
mosaic
motion
motionblur
motiondetect
netsync
oldrc
osdmenu
podcast
posterize
psychedelic
puzzle
real
remoteosd
ripple
rss
sap
scene
sharpen
speex_resampler
stats
stream_filter_record
t140
visual
wall
yuv
.dummy
"
###########################
# Build buildsystem tools #
###########################
export PATH="$VLC_SRC_DIR/extras/tools/build/bin:$PATH"
echo "Building tools"
(cd $VLC_SRC_DIR/extras/tools && ./bootstrap)
avlc_checkfail "buildsystem tools: bootstrap failed"
make -C $VLC_SRC_DIR/extras/tools $MAKEFLAGS
avlc_checkfail "buildsystem tools: make failed"
VLC_CONTRIB="$VLC_SRC_DIR/contrib/$TARGET_TUPLE"
#############
# BOOTSTRAP #
#############
if [ ! -f $VLC_SRC_DIR/configure ]; then
echo "Bootstraping"
(cd $VLC_SRC_DIR && ./bootstrap)
avlc_checkfail "vlc: bootstrap failed"
fi
############
# Contribs #
############
echo "Building the contribs"
VLC_CONTRIB_DIR=$VLC_SRC_DIR/contrib/contrib-android-${TARGET_TUPLE}
VLC_CONTRIB_OUT_DIR=$VLC_SRC_DIR/contrib/${TARGET_TUPLE}
mkdir -p $VLC_CONTRIB_OUT_DIR/lib/pkgconfig
avlc_gen_pc_file $VLC_CONTRIB_OUT_DIR/lib/pkgconfig EGL 1.1
avlc_gen_pc_file $VLC_CONTRIB_OUT_DIR/lib/pkgconfig GLESv2 2
mkdir -p $VLC_CONTRIB_DIR/lib/pkgconfig
# TODO: VLC 4.0 won't rm config.mak after each call to bootstrap. Move it just
# before ">> config.make" when switching to VLC 4.0
rm -f $VLC_CONTRIB_DIR/config.mak
# gettext
which autopoint >/dev/null
if [ ! $? -eq 0 ];then
VLC_CONTRIB_ARGS="$VLC_CONTRIB_ARGS --enable-gettext"
else
VLC_CONTRIB_ARGS="$VLC_CONTRIB_ARGS --disable-gettext"
fi
(cd $VLC_CONTRIB_DIR && ANDROID_ABI=${ANDROID_ABI} ANDROID_API=${ANDROID_API} \
../bootstrap --host=${TARGET_TUPLE} ${VLC_CONTRIB_ARGS})
avlc_checkfail "contribs: bootstrap failed"
if [ "$AVLC_USE_PREBUILT_CONTRIBS" -gt "0" ]; then
# Fetch prebuilt contribs
if [ -z "$VLC_PREBUILT_CONTRIBS_URL" ]; then
make -C $VLC_CONTRIB_DIR prebuilt
avlc_checkfail "Fetching prebuilt contribs failed"
else
make -C $VLC_CONTRIB_DIR prebuilt PREBUILT_URL="$VLC_PREBUILT_CONTRIBS_URL"
avlc_checkfail "Fetching prebuilt contribs from ${VLC_PREBUILT_CONTRIBS_URL} failed"
fi
# list packages to be built
make -C $VLC_CONTRIB_DIR TARBALLS="$VLC_TARBALLS" list
# build native tools
make -C $VLC_CONTRIB_DIR TARBALLS="$VLC_TARBALLS" tools
else
# Some libraries have arm assembly which won't build in thumb mode
# We append -marm to the CFLAGS of these libs to disable thumb mode
[ ${ANDROID_ABI} = "armeabi-v7a" ] && echo "NOTHUMB := -marm" >> $VLC_CONTRIB_DIR/config.mak
echo "EXTRA_CFLAGS=${VLC_CFLAGS}" >> $VLC_CONTRIB_DIR/config.mak
echo "EXTRA_CXXFLAGS=${VLC_CXXFLAGS}" >> $VLC_CONTRIB_DIR/config.mak
echo "CC=${CROSS_CLANG}" >> $VLC_CONTRIB_DIR/config.mak
echo "CXX=${CROSS_CLANG}++" >> $VLC_CONTRIB_DIR/config.mak
echo "AR=${CROSS_TOOLS}ar" >> $VLC_CONTRIB_DIR/config.mak
echo "AS=${CROSS_TOOLS}as" >> $VLC_CONTRIB_DIR/config.mak
echo "RANLIB=${CROSS_TOOLS}ranlib" >> $VLC_CONTRIB_DIR/config.mak
echo "LD=${CROSS_TOOLS}ld" >> $VLC_CONTRIB_DIR/config.mak
echo "NM=${CROSS_TOOLS}nm" >> $VLC_CONTRIB_DIR/config.mak
echo "STRIP=${CROSS_TOOLS}strip" >> $VLC_CONTRIB_DIR/config.mak
# list packages to be built
make -C $VLC_CONTRIB_DIR TARBALLS="$VLC_TARBALLS" list
make -C $VLC_CONTRIB_DIR TARBALLS="$VLC_TARBALLS" $MAKEFLAGS fetch
avlc_checkfail "contribs: make fetch failed"
#export the PATH
# Make
make -C $VLC_CONTRIB_DIR TARBALLS="$VLC_TARBALLS" $MAKEFLAGS -k || make -C $VLC_CONTRIB_DIR TARBALLS="$VLC_TARBALLS" $MAKEFLAGS -j1
avlc_checkfail "contribs: make failed"
# Make prebuilt contribs package
if [ "$AVLC_MAKE_PREBUILT_CONTRIBS" -gt "0" ]; then
make -C $VLC_CONTRIB_DIR package
avlc_checkfail "Creating prebuilt contribs package failed"
fi
fi
mkdir -p $VLC_BUILD_DIR
#############
# CONFIGURE #
#############
if [ ${ANDROID_API} -lt "26" ]; then
# android APIs < 26 have empty sys/shm.h headers that triggers shm detection but it
# doesn't have any shm functions and/or symbols. */
export ac_cv_header_sys_shm_h=no
fi
# always use fixups for search.h and tdestroy
export ac_cv_header_search_h=no
export ac_cv_func_tdestroy=no
export ac_cv_func_tfind=no
if [ ! -e $VLC_BUILD_DIR/config.h -o "$AVLC_RELEASE" = 1 ]; then
VLC_CONFIGURE_DEBUG=""
if [ ! "$AVLC_RELEASE" = 1 ]; then
VLC_CONFIGURE_DEBUG="--enable-debug --disable-branch-protection"
fi
BEFORE_VLC_BUILD_DIR=$(pwd -P)
cd $VLC_BUILD_DIR
CFLAGS="${VLC_CFLAGS}" \
CXXFLAGS="${VLC_CFLAGS} ${VLC_CXXFLAGS}" \
CC="${CROSS_CLANG}" \
CXX="${CROSS_CLANG}++" \
NM="${CROSS_TOOLS}nm" \
STRIP="${CROSS_TOOLS}strip" \
RANLIB="${CROSS_TOOLS}ranlib" \
AR="${CROSS_TOOLS}ar" \
AS="${CROSS_TOOLS}as" \
PKG_CONFIG_LIBDIR=$VLC_SRC_DIR/contrib/$TARGET_TUPLE/lib/pkgconfig \
../configure --host=$TARGET_TUPLE \
--with-contrib=${VLC_SRC_DIR}/contrib/${TARGET_TUPLE} \
--prefix=${VLC_BUILD_DIR}/install/ \
${EXTRA_PARAMS} ${VLC_CONFIGURE_ARGS} ${VLC_CONFIGURE_DEBUG}
cd "$BEFORE_VLC_BUILD_DIR"
avlc_checkfail "vlc: configure failed"
fi
############
# BUILDING #
############
echo "Building"
make -C $VLC_BUILD_DIR $MAKEFLAGS
avlc_checkfail "vlc: make failed"
make -C $VLC_BUILD_DIR install
avlc_checkfail "vlc: make install failed"
##################
# libVLC modules #
##################
REDEFINED_VLC_MODULES_DIR=${VLC_BUILD_DIR}/install/lib/vlc/plugins
rm -rf ${REDEFINED_VLC_MODULES_DIR}
mkdir -p ${REDEFINED_VLC_MODULES_DIR}
echo "Generating static module list"
blacklist_regexp=
for i in ${VLC_MODULE_BLACKLIST}
do
if [ -z "${blacklist_regexp}" ]
then
blacklist_regexp="${i}"
else
blacklist_regexp="${blacklist_regexp}|${i}"
fi
done
VLC_MODULES=$(avlc_find_modules ${VLC_BUILD_DIR}/modules)
DEFINITION="";
SYMBOLS_TO_REDEFINE=""
# add a symbol to the SYMBOLS_TO_REDIFINE list
avlc_add_symbol_to_redefine() {
SYMBOLS_TO_REDEFINE="${SYMBOLS_TO_REDEFINE} $1"
}
# find and return the path of $2 inside $1
avlc_find_lib() {
find $1 -name '$2'
}
# get all global symbols of a library and add them to SYMBOLS_TO_REDIFINE list
avlc_add_lib_to_redefine() {
avlc_add_symbol_to_redefine "$("${CROSS_TOOLS}nm" -g $(avlc_find_lib ${VLC_BUILD_DIR} $1) | grep ' T ' | cut -f3 -d ' ')"
}
# Generic symbols
avlc_add_symbol_to_redefine AccessOpen
avlc_add_symbol_to_redefine AccessClose
avlc_add_symbol_to_redefine StreamOpen
avlc_add_symbol_to_redefine StreamClose
avlc_add_symbol_to_redefine OpenDemux
avlc_add_symbol_to_redefine CloseDemux
avlc_add_symbol_to_redefine DemuxOpen
avlc_add_symbol_to_redefine DemuxClose
avlc_add_symbol_to_redefine OpenFilter
avlc_add_symbol_to_redefine CloseFilter
avlc_add_symbol_to_redefine Open
avlc_add_symbol_to_redefine Close
#libvlc_json
avlc_add_symbol_to_redefine json_read
avlc_add_symbol_to_redefine json_parse_error
avlc_add_lib_to_redefine libvlc_json.a
BUILTINS="const void *vlc_static_modules[] = {\n";
for file in $VLC_MODULES; do
outfile=${REDEFINED_VLC_MODULES_DIR}/$(basename $file)
name=$(echo $file | sed 's/.*\.libs\/lib//' | sed 's/_plugin\.a//');
symbols=$("${CROSS_TOOLS}nm" -g $file)
# ensure that all modules have differents symbol names
entry=$(avlc_get_symbol "$symbols" _)
copyright=$(avlc_get_symbol "$symbols" copyright)
license=$(avlc_get_symbol "$symbols" license)
cat <<EOF > ${REDEFINED_VLC_MODULES_DIR}/syms
$entry vlc_entry__$name
$copyright vlc_entry_copyright__$name
$license vlc_entry_license__$name
EOF
for sym in ${SYMBOLS_TO_REDEFINE}; do
echo "$sym ${sym}__${name}" >> ${REDEFINED_VLC_MODULES_DIR}/syms
done
cmd="${CROSS_TOOLS}objcopy --redefine-syms ${REDEFINED_VLC_MODULES_DIR}/syms $file $outfile"
${cmd} || (echo "cmd failed: $cmd" && exit 1)
DEFINITION=$DEFINITION"int vlc_entry__$name (int (*)(void *, void *, int, ...), void *);\n";
BUILTINS="$BUILTINS vlc_entry__$name,\n";
done;
BUILTINS="$BUILTINS NULL\n};\n"; \
printf "/* Autogenerated from the list of modules */\n#include <unistd.h>\n$DEFINITION\n$BUILTINS\n" > $VLC_OUT_PATH/libvlcjni-modules.c
DEFINITION=""
BUILTINS="const void *libvlc_functions[] = {\n";
for func in $(cat $VLC_SRC_DIR/lib/libvlc.sym)
do
DEFINITION=$DEFINITION"int $func(void);\n";
BUILTINS="$BUILTINS $func,\n";
done
BUILTINS="$BUILTINS NULL\n};\n"; \
printf "/* Autogenerated from the list of modules */\n#include <unistd.h>\n$DEFINITION\n$BUILTINS\n" > $VLC_OUT_PATH/libvlcjni-symbols.c
rm ${REDEFINED_VLC_MODULES_DIR}/syms
###########################
# NDK-Build for libvlc.so #
###########################
VLC_MODULES=$(avlc_find_modules ${REDEFINED_VLC_MODULES_DIR})
VLC_CONTRIB_LDFLAGS=$(for i in $(/bin/ls $VLC_CONTRIB/lib/pkgconfig/*.pc); do avlc_pkgconfig --libs $i; done |xargs)
# Lua contrib doesn't expose a pkg-config file with libvlc 3.x and is
# not probed by the previous command in VLC_CONTRIB_LDFLAGS, so probe
# whether it was detected or add it manually to the LDFLAGS.
if ! avlc_pkgconfig --exists lua; then
VLC_CONTRIB_LDFLAGS="$VLC_CONTRIB_LDFLAGS '$VLC_CONTRIB/lib/liblua.a'"
fi
echo -e "ndk-build vlc"
$NDK_BUILD -C $LIBVLCJNI_ROOT/libvlc \
APP_STL="c++_shared" \
APP_CPPFLAGS="-frtti -fexceptions" \
VLC_SRC_DIR="$VLC_SRC_DIR" \
VLC_BUILD_DIR="$VLC_BUILD_DIR" \
VLC_CONTRIB="$VLC_CONTRIB" \
VLC_CONTRIB_LDFLAGS="$VLC_CONTRIB_LDFLAGS" \
VLC_MODULES="$VLC_MODULES" \
APP_BUILD_SCRIPT=jni/libvlc.mk \
APP_PLATFORM=android-${ANDROID_API} \
APP_ABI=${ANDROID_ABI} \
NDK_PROJECT_PATH=jni \
NDK_TOOLCHAIN_VERSION=clang \
NDK_DEBUG=${NDK_DEBUG}
avlc_checkfail "ndk-build libvlc failed"
libvlc_pc_dir="$LIBVLCJNI_ROOT/libvlc/jni/pkgconfig/${ANDROID_ABI}"
mkdir -p "${libvlc_pc_dir}"
PC_PREFIX="$(cd $LIBVLCJNI_ROOT/libvlc/jni/; pwd -P)" \
PC_LIBDIR="$(cd $LIBVLCJNI_ROOT/libvlc/jni/libs/${ANDROID_ABI}; pwd -P)" \
PC_INCLUDEDIR="$(cd $VLC_SRC_DIR/include/; pwd -P)" \
PC_CFLAGS="-I\${includedir}" \
PC_LIBS="-L\${libdir}" \
avlc_gen_pc_file "${libvlc_pc_dir}" libvlc 4.0.0
} # avlc_build()
if [ "$AVLC_SOURCED" != "1" ]; then
avlc_build
fi
#!/bin/sh
set -e
#############
# ARGUMENTS #
#############
AVLC_RELEASE=$RELEASE
while [ $# -gt 0 ]; do
case $1 in
help|--help)
echo "Use -a to set the ARCH"
echo "Use --release to build in release mode"
exit 1
;;
a|-a)
ANDROID_ABI=$2
shift
;;
release|--release)
AVLC_RELEASE=1
;;
esac
shift
done
#########
# FLAGS #
#########
if [ "${ANDROID_ABI}" = "arm" ] ; then
ANDROID_ABI="armeabi-v7a"
elif [ "${ANDROID_ABI}" = "arm64" ] ; then
ANDROID_ABI="arm64-v8a"
fi
# Set up ABI variables
if [ "${ANDROID_ABI}" = "x86" ] ; then
TARGET_TUPLE="i686-linux-android"
CLANG_PREFIX=${TARGET_TUPLE}
elif [ "${ANDROID_ABI}" = "x86_64" ] ; then
TARGET_TUPLE="x86_64-linux-android"
CLANG_PREFIX=${TARGET_TUPLE}
elif [ "${ANDROID_ABI}" = "arm64-v8a" ] ; then
TARGET_TUPLE="aarch64-linux-android"
CLANG_PREFIX=${TARGET_TUPLE}
elif [ "${ANDROID_ABI}" = "armeabi-v7a" ] ; then
TARGET_TUPLE="arm-linux-androideabi"
CLANG_PREFIX="armv7a-linux-androideabi"
else
echo "Please pass the ANDROID ABI to the correct architecture, using
compile-libvlc.sh -a ARCH
ARM: (armeabi-v7a|arm)
ARM64: (arm64-v8a|arm64)
X86: x86, x86_64"
exit 1
fi
# try to detect NDK version
REL=$(grep -o '^Pkg.Revision.*[0-9]*.*' $ANDROID_NDK/source.properties |cut -d " " -f 3 | cut -d "." -f 1)
if [ "$REL" = 27 ]; then
ANDROID_API=21
else
echo "NDK v27 needed, got $REL, cf. https://developer.android.com/ndk/downloads/"
exit 1
fi
############
# VLC PATH #
############
LIBVLCJNI_ROOT="$(cd "$(dirname "$0")/.."; pwd -P)"
# Fix path if the script is sourced from vlc-android
if [ -d $LIBVLCJNI_ROOT/libvlcjni ];then
LIBVLCJNI_ROOT=$LIBVLCJNI_ROOT/libvlcjni
fi
if [ -f $LIBVLCJNI_ROOT/src/libvlc.h ];then
VLC_SRC_DIR="$LIBVLCJNI_ROOT"
elif [ -f $PWD/src/libvlc.h ];then
VLC_SRC_DIR="$PWD"
elif [ -d $LIBVLCJNI_ROOT/vlc ];then
VLC_SRC_DIR=$LIBVLCJNI_ROOT/vlc
else
echo "Could not find vlc sources"
exit 1
fi
VLC_BUILD_DIR="$(cd $VLC_SRC_DIR/; pwd)/build-android-${TARGET_TUPLE}"
if [ -z $VLC_TARBALLS ]; then
VLC_TARBALLS="$(cd $VLC_SRC_DIR/;pwd)/contrib/tarballs"
fi
if [ ! -d $VLC_TARBALLS ]; then
mkdir -p $VLC_TARBALLS
fi
VLC_OUT_PATH="$VLC_BUILD_DIR/ndk"
mkdir -p $VLC_OUT_PATH
#################
# NDK TOOLCHAIN #
#################
host_tag=""
case $(uname | tr '[:upper:]' '[:lower:]') in
linux*) host_tag="linux" ;;
darwin*) host_tag="darwin" ;;
msys*) host_tag="windows" ;;
*) echo "host OS not handled"; exit 1 ;;
esac
NDK_TOOLCHAIN_DIR=${ANDROID_NDK}/toolchains/llvm/prebuilt/${host_tag}-x86_64
NDK_TOOLCHAIN_PATH=${NDK_TOOLCHAIN_DIR}/bin
export PATH="${NDK_TOOLCHAIN_PATH}:${PATH}"
NDK_BUILD=$ANDROID_NDK/ndk-build
if [ ! -z "$MSYSTEM_PREFIX" ] ; then
# The make.exe and awk.exe from the toolchain don't work in msys
export PATH="$MSYSTEM_PREFIX/bin:/usr/bin:${NDK_TOOLCHAIN_PATH}:${PATH}"
NDK_BUILD=$NDK_BUILD.cmd
fi
##########
# CFLAGS #
##########
# Release or not?
if [ "$AVLC_RELEASE" = 1 ]; then
NDK_DEBUG=0
else
NDK_DEBUG=1
fi
###############
# DISPLAY ABI #
###############
echo "ABI: $ANDROID_ABI"
echo "API: $ANDROID_API"
echo "PATH: $PATH"
if [ -z "$ANDROID_NDK" ]; then
echo "Please set the ANDROID_NDK environment variable with its path."
exit 1
fi
if [ -z "$ANDROID_ABI" ]; then
echo "Please pass the ANDROID ABI to the correct architecture, using
compile-libvlc.sh -a ARCH
ARM: (armeabi-v7a|arm)
ARM64: (arm64-v8a|arm64)
X86: x86, x86_64"
exit 1
fi
avlc_checkfail()
{
if [ ! $? -eq 0 ];then
echo "$1"
exit 1
fi
}
avlc_build()
{
$NDK_BUILD -C $LIBVLCJNI_ROOT/libvlc \
APP_STL="c++_shared" \
APP_CPPFLAGS="-frtti -fexceptions" \
VLC_SRC_DIR="$VLC_SRC_DIR" \
VLC_BUILD_DIR="$VLC_BUILD_DIR" \
APP_BUILD_SCRIPT=jni/libvlcjni.mk \
APP_PLATFORM=android-${ANDROID_API} \
APP_ABI=${ANDROID_ABI} \
NDK_PROJECT_PATH=jni \
NDK_TOOLCHAIN_VERSION=clang \
NDK_DEBUG=${NDK_DEBUG}
avlc_checkfail "ndk-build libvlcjni failed"
# Remove gdbserver to avoid conflict with libvlcjni.so debug options
rm -f $VLC_OUT_PATH/libs/${ANDROID_ABI}/gdb*
} # avlc_build()
if [ "$AVLC_SOURCED" != "1" ]; then
avlc_build
fi
......@@ -13,6 +13,8 @@ AVLC_MAKE_PREBUILT_CONTRIBS=0
# Indicates that prebuit contribs should be
# used instead of building the contribs from source
AVLC_USE_PREBUILT_CONTRIBS=0
# JNI build can be disabled for testing/CI purpose
AVLC_BUILD_JNI=1
while [ $# -gt 0 ]; do
case $1 in
help|--help)
......@@ -26,12 +28,18 @@ while [ $# -gt 0 ]; do
;;
release|--release)
AVLC_RELEASE=1
LIBVLC_RELEASE="--release"
;;
--package-contribs)
AVLC_MAKE_PREBUILT_CONTRIBS=1
LIBVLC_PACKAGE_CONTRIBS="--package-contribs"
;;
--with-prebuilt-contribs)
AVLC_USE_PREBUILT_CONTRIBS=1
LIBVLC_PREBUILT_CONTRIBS="--with-prebuilt-contribs"
;;
--no-jni)
AVLC_BUILD_JNI=0
;;
esac
shift
......@@ -74,17 +82,13 @@ elif [ "${ANDROID_ABI}" = "x86_64" ] ; then
TARGET_TUPLE="x86_64-linux-android"
CLANG_PREFIX=${TARGET_TUPLE}
PLATFORM_SHORT_ARCH="x86_64"
HAVE_64=1
elif [ "${ANDROID_ABI}" = "arm64-v8a" ] ; then
TARGET_TUPLE="aarch64-linux-android"
CLANG_PREFIX=${TARGET_TUPLE}
HAVE_ARM=1
HAVE_64=1
PLATFORM_SHORT_ARCH="arm64"
elif [ "${ANDROID_ABI}" = "armeabi-v7a" ] ; then
TARGET_TUPLE="arm-linux-androideabi"
CLANG_PREFIX="armv7a-linux-androideabi"
HAVE_ARM=1
PLATFORM_SHORT_ARCH="arm"
else
echo "Please pass the ANDROID ABI to the correct architecture, using
......@@ -98,27 +102,42 @@ fi
# try to detect NDK version
REL=$(grep -o '^Pkg.Revision.*[0-9]*.*' $ANDROID_NDK/source.properties |cut -d " " -f 3 | cut -d "." -f 1)
if [ "$REL" -eq 25 ]; then
if [ "$REL" = 27 ]; then
ANDROID_API=21
else
echo "NDK v25 needed, cf. https://developer.android.com/ndk/downloads/"
echo "NDK v27 needed, got $REL, cf. https://developer.android.com/ndk/downloads/"
exit 1
fi
############
# VLC PATH #
############
SRC_DIR=$PWD
if [ -f $SRC_DIR/src/libvlc.h ];then
VLC_SRC_DIR="$SRC_DIR"
elif [ -d $SRC_DIR/vlc ];then
VLC_SRC_DIR=$SRC_DIR/vlc
LIBVLCJNI_SRC_DIR="$(cd "$(dirname "$0")"; pwd -P)/.."
# Fix path if the script is sourced from vlc-android
if [ -d $LIBVLCJNI_SRC_DIR/libvlcjni ];then
LIBVLCJNI_SRC_DIR=$LIBVLCJNI_SRC_DIR/libvlcjni
fi
if [ -f $LIBVLCJNI_SRC_DIR/src/libvlc.h ];then
VLC_SRC_DIR="$LIBVLCJNI_SRC_DIR"
elif [ -f $PWD/src/libvlc.h ];then
VLC_SRC_DIR="$PWD"
elif [ -d $LIBVLCJNI_SRC_DIR/vlc ];then
VLC_SRC_DIR=$LIBVLCJNI_SRC_DIR/vlc
else
echo "Could not find vlc sources"
exit 1
fi
VLC_BUILD_DIR="$(cd $VLC_SRC_DIR/; pwd)/build-android-${TARGET_TUPLE}"
if [ -z $VLC_TARBALLS ]; then
VLC_TARBALLS="$(cd $VLC_SRC_DIR/;pwd)/contrib/tarballs"
fi
if [ ! -d $VLC_TARBALLS ]; then
mkdir -p $VLC_TARBALLS
fi
VLC_OUT_PATH="$VLC_BUILD_DIR/ndk"
mkdir -p $VLC_OUT_PATH
......@@ -215,12 +234,25 @@ avlc_get_symbol()
avlc_gen_pc_file()
{
echo "Generating $1 pkg-config file"
echo "Name: $1
Description: $1
Version: $2
Libs: -l$1
Cflags:" > contrib/${TARGET_TUPLE}/lib/pkgconfig/$(echo $1|tr 'A-Z' 'a-z').pc
echo -n "Generating $2 pkg-config file: "
echo $1/$(echo $2|tr 'A-Z' 'a-z').pc
exec 3<> $1/$(echo $2|tr 'A-Z' 'a-z').pc
[ ! -z "${PC_PREFIX}" ] &&
echo "prefix=${PC_PREFIX}" >&3
[ ! -z "${PC_LIBDIR}" ] &&
echo "libdir=${PC_LIBDIR}" >&3
[ ! -z "${PC_INCLUDEDIR}" ] &&
echo "includedir=${PC_INCLUDEDIR}" >&3
echo "" >&3
echo "Name: $2" >&3
echo "Description: $2" >&3
echo "Version: $3" >&3
echo "Libs: ${PC_LIBS} -l$2" >&3
echo "Cflags: ${PC_CFLAGS}" >&3
exec 3>&-
}
avlc_pkgconfig()
......@@ -233,449 +265,12 @@ avlc_pkgconfig()
avlc_build()
{
###########################
# VLC BOOTSTRAP ARGUMENTS #
###########################
VLC_BOOTSTRAP_ARGS="\
--enable-dvdread \
--enable-dvdnav \
--disable-dca \
--disable-goom \
--disable-chromaprint \
--enable-lua \
--disable-schroedinger \
--disable-sdl \
--disable-SDL_image \
--disable-fontconfig \
--enable-zvbi \
--disable-kate \
--disable-caca \
--disable-gettext \
--disable-mpcdec \
--enable-upnp \
--enable-gme \
--disable-tremor \
--enable-vorbis \
--disable-sidplay2 \
--disable-samplerate \
--disable-faad2 \
--enable-harfbuzz \
--enable-iconv \
--disable-aribb24 \
--disable-aribb25 \
--enable-mpg123 \
--enable-libdsm \
--enable-smb2 \
--enable-libarchive \
--disable-libmpeg2 \
--enable-soxr \
--enable-nfs \
--enable-microdns \
--enable-fluidlite \
--disable-mad \
--disable-vncclient \
--disable-vnc \
--enable-jpeg \
--enable-libplacebo \
--enable-ad-clauses \
--disable-srt \
--enable-vpx \
--disable-x265 \
--disable-medialibrary \
"
###########################
# VLC CONFIGURE ARGUMENTS #
###########################
VLC_CONFIGURE_ARGS="\
--with-pic \
--disable-nls \
--enable-live555 --enable-realrtsp \
--enable-avformat \
--enable-swscale \
--enable-avcodec \
--enable-opus \
--enable-opensles \
--enable-matroska \
--enable-taglib \
--enable-dvbpsi \
--disable-vlc --disable-shared \
--disable-update-check \
--disable-vlm \
--disable-dbus \
--enable-lua \
--disable-vcd \
--disable-v4l2 \
--enable-dvdread \
--enable-dvdnav \
--enable-bluray \
--disable-linsys \
--disable-decklink \
--disable-libva \
--disable-dv1394 \
--enable-mod \
--disable-sid \
--enable-gme \
--disable-tremor \
--disable-mad \
--enable-mpg123 \
--disable-dca \
--disable-sdl-image \
--enable-zvbi \
--disable-fluidsynth \
--enable-fluidlite \
--disable-jack \
--disable-pulse \
--disable-alsa \
--disable-samplerate \
--disable-xcb \
--disable-qt \
--disable-skins2 \
--disable-mtp \
--disable-notify \
--enable-libass \
--disable-svg \
--disable-udev \
--enable-libxml2 \
--disable-caca \
--enable-gles2 \
--disable-goom \
--disable-projectm \
--enable-sout \
--enable-vorbis \
--disable-faad \
--disable-schroedinger \
--disable-vnc \
--enable-jpeg \
--enable-smb2 \
"
########################
# VLC MODULE BLACKLIST #
########################
VLC_MODULE_BLACKLIST="
addons.*
stats
access_(bd|shm|imem)
oldrc
real
hotkeys
gestures
sap
dynamicoverlay
rss
ball
audiobargraph_[av]
clone
mosaic
osdmenu
puzzle
mediadirs
t140
ripple
motion
sharpen
grain
posterize
mirror
wall
scene
blendbench
psychedelic
alphamask
netsync
audioscrobbler
motiondetect
motionblur
export
podcast
bluescreen
erase
stream_filter_record
speex_resampler
remoteosd
magnify
gradient
dtstofloat32
logger
visual
fb
aout_file
yuv
.dummy
"
###########################
# Build buildsystem tools #
###########################
export PATH="$VLC_SRC_DIR/extras/tools/build/bin:$PATH"
echo "Building tools"
cd $VLC_SRC_DIR/extras/tools
./bootstrap
avlc_checkfail "buildsystem tools: bootstrap failed"
make $MAKEFLAGS
avlc_checkfail "buildsystem tools: make failed"
make $MAKEFLAGS .gas || make $MAKEFLAGS .buildgas
avlc_checkfail "buildsystem tools: make failed"
cd ../../..
VLC_CONTRIB="$VLC_SRC_DIR/contrib/$TARGET_TUPLE"
cd $VLC_SRC_DIR
#############
# BOOTSTRAP #
#############
if [ ! -f configure ]; then
echo "Bootstraping"
./bootstrap
avlc_checkfail "vlc: bootstrap failed"
fi
############
# Contribs #
############
echo "Building the contribs"
mkdir -p contrib/contrib-android-${TARGET_TUPLE}
mkdir -p contrib/${TARGET_TUPLE}/lib/pkgconfig
avlc_gen_pc_file EGL 1.1
avlc_gen_pc_file GLESv2 2
cd contrib/contrib-android-${TARGET_TUPLE}
# TODO: VLC 4.0 won't rm config.mak after each call to bootstrap. Move it just
# before ">> config.make" when switching to VLC 4.0
rm -f config.mak
export USE_FFMPEG=1
ANDROID_ABI=${ANDROID_ABI} ANDROID_API=${ANDROID_API} \
../bootstrap --host=${TARGET_TUPLE} ${VLC_BOOTSTRAP_ARGS}
avlc_checkfail "contribs: bootstrap failed"
if [ "$AVLC_USE_PREBUILT_CONTRIBS" -gt "0" ]; then
# Fetch prebuilt contribs
if [ -z "$VLC_PREBUILT_CONTRIBS_URL" ]; then
make prebuilt
avlc_checkfail "Fetching prebuilt contribs failed"
else
make prebuilt PREBUILT_URL="$VLC_PREBUILT_CONTRIBS_URL"
avlc_checkfail "Fetching prebuilt contribs from ${VLC_PREBUILT_CONTRIBS_URL} failed"
fi
make .luac
else
# Some libraries have arm assembly which won't build in thumb mode
# We append -marm to the CFLAGS of these libs to disable thumb mode
[ ${ANDROID_ABI} = "armeabi-v7a" ] && echo "NOTHUMB := -marm" >> config.mak
echo "EXTRA_CFLAGS=${VLC_CFLAGS}" >> config.mak
echo "EXTRA_CXXFLAGS=${VLC_CXXFLAGS}" >> config.mak
echo "CC=${CROSS_CLANG}" >> config.mak
echo "CXX=${CROSS_CLANG}++" >> config.mak
echo "AR=${CROSS_TOOLS}ar" >> config.mak
echo "AS=${CROSS_TOOLS}as" >> config.mak
echo "RANLIB=${CROSS_TOOLS}ranlib" >> config.mak
echo "LD=${CROSS_TOOLS}ld" >> config.mak
echo "NM=${CROSS_TOOLS}nm" >> config.mak
echo "STRIP=${CROSS_TOOLS}strip" >> config.mak
# fix modplug endianess check (narrowing error)
export ac_cv_c_bigendian=no
make $MAKEFLAGS fetch
avlc_checkfail "contribs: make fetch failed"
# gettext
which autopoint >/dev/null || make $MAKEFLAGS .gettext
#export the PATH
# Make
make $MAKEFLAGS
avlc_checkfail "contribs: make failed"
# Make prebuilt contribs package
if [ "$AVLC_MAKE_PREBUILT_CONTRIBS" -gt "0" ]; then
make package
avlc_checkfail "Creating prebuilt contribs package failed"
fi
fi
cd ../../
$LIBVLCJNI_SRC_DIR/buildsystem/build-libvlc.sh -a $ANDROID_ABI $LIBVLC_RELEASE $LIBVLC_PACKAGE_CONTRIBS $LIBVLC_PREBUILT_CONTRIBS
mkdir -p $VLC_BUILD_DIR && cd $VLC_BUILD_DIR
#############
# CONFIGURE #
#############
if [ ${ANDROID_API} -lt "26" ]; then
# android APIs < 26 have empty sys/shm.h headers that triggers shm detection but it
# doesn't have any shm functions and/or symbols. */
export ac_cv_header_sys_shm_h=no
fi
if [ ${ANDROID_API} -lt "21" ] ; then
# force uselocale using libandroid_support since it's present in libc++
export ac_cv_func_uselocale=yes
VLC_LDFLAGS="-landroid_support"
fi
# always use fixups for search.h and tdestroy
export ac_cv_header_search_h=no
export ac_cv_func_tdestroy=no
export ac_cv_func_tfind=no
if [ ! -e ./config.h -o "$AVLC_RELEASE" = 1 ]; then
VLC_CONFIGURE_DEBUG=""
if [ ! "$AVLC_RELEASE" = 1 ]; then
VLC_CONFIGURE_DEBUG="--enable-debug --disable-branch-protection"
fi
CFLAGS="${VLC_CFLAGS}" \
CXXFLAGS="${VLC_CFLAGS} ${VLC_CXXFLAGS}" \
CC="${CROSS_CLANG}" \
CXX="${CROSS_CLANG}++" \
NM="${CROSS_TOOLS}nm" \
STRIP="${CROSS_TOOLS}strip" \
RANLIB="${CROSS_TOOLS}ranlib" \
AR="${CROSS_TOOLS}ar" \
AS="${CROSS_TOOLS}as" \
PKG_CONFIG_LIBDIR=$VLC_SRC_DIR/contrib/$TARGET_TUPLE/lib/pkgconfig \
PKG_CONFIG_PATH=$VLC_SRC_DIR/contrib/$TARGET_TUPLE/lib/pkgconfig \
PATH=../contrib/bin:$PATH \
sh ../configure --host=$TARGET_TUPLE --build=x86_64-unknown-linux \
--with-contrib=${VLC_SRC_DIR}/contrib/${TARGET_TUPLE} \
--prefix=${VLC_BUILD_DIR}/install/ \
${EXTRA_PARAMS} ${VLC_CONFIGURE_ARGS} ${VLC_CONFIGURE_DEBUG}
avlc_checkfail "vlc: configure failed"
fi
############
# BUILDING #
############
echo "Building"
make $MAKEFLAGS
avlc_checkfail "vlc: make failed"
make install
avlc_checkfail "vlc: make install failed"
cd $SRC_DIR
##################
# libVLC modules #
##################
REDEFINED_VLC_MODULES_DIR=${VLC_BUILD_DIR}/install/lib/vlc/plugins
rm -rf ${REDEFINED_VLC_MODULES_DIR}
mkdir -p ${REDEFINED_VLC_MODULES_DIR}
echo "Generating static module list"
blacklist_regexp=
for i in ${VLC_MODULE_BLACKLIST}
do
if [ -z "${blacklist_regexp}" ]
then
blacklist_regexp="${i}"
else
blacklist_regexp="${blacklist_regexp}|${i}"
fi
done
VLC_MODULES=$(avlc_find_modules ${VLC_BUILD_DIR}/modules)
DEFINITION="";
BUILTINS="const void *vlc_static_modules[] = {\n";
for file in $VLC_MODULES; do
outfile=${REDEFINED_VLC_MODULES_DIR}/$(basename $file)
name=$(echo $file | sed 's/.*\.libs\/lib//' | sed 's/_plugin\.a//');
symbols=$("${CROSS_TOOLS}nm" -g $file)
# assure that all modules have differents symbol names
entry=$(avlc_get_symbol "$symbols" _)
copyright=$(avlc_get_symbol "$symbols" copyright)
license=$(avlc_get_symbol "$symbols" license)
cat <<EOF > ${REDEFINED_VLC_MODULES_DIR}/syms
AccessOpen AccessOpen__$name
AccessClose AccessClose__$name
StreamOpen StreamOpen__$name
StreamClose StreamClose__$name
OpenDemux OpenDemux__$name
CloseDemux CloseDemux__$name
DemuxOpen DemuxOpen__$name
DemuxClose DemuxClose__$name
OpenFilter OpenFilter__$name
CloseFilter CloseFilter__$name
Open Open__$name
Close Close__$name
$entry vlc_entry__$name
$copyright vlc_entry_copyright__$name
$license vlc_entry_license__$name
EOF
cmd="${CROSS_TOOLS}objcopy --redefine-syms ${REDEFINED_VLC_MODULES_DIR}/syms $file $outfile"
${cmd} || (echo "cmd failed: $cmd" && exit 1)
DEFINITION=$DEFINITION"int vlc_entry__$name (int (*)(void *, void *, int, ...), void *);\n";
BUILTINS="$BUILTINS vlc_entry__$name,\n";
done;
BUILTINS="$BUILTINS NULL\n};\n"; \
printf "/* Autogenerated from the list of modules */\n#include <unistd.h>\n$DEFINITION\n$BUILTINS\n" > $VLC_OUT_PATH/libvlcjni-modules.c
DEFINITION=""
BUILTINS="const void *libvlc_functions[] = {\n";
for func in $(cat $VLC_SRC_DIR/lib/libvlc.sym)
do
DEFINITION=$DEFINITION"int $func(void);\n";
BUILTINS="$BUILTINS $func,\n";
done
BUILTINS="$BUILTINS NULL\n};\n"; \
printf "/* Autogenerated from the list of modules */\n#include <unistd.h>\n$DEFINITION\n$BUILTINS\n" > $VLC_OUT_PATH/libvlcjni-symbols.c
rm ${REDEFINED_VLC_MODULES_DIR}/syms
###########################
# NDK-Build for libvlc.so #
###########################
VLC_MODULES=$(avlc_find_modules ${REDEFINED_VLC_MODULES_DIR})
VLC_CONTRIB_LDFLAGS=$(for i in $(/bin/ls $VLC_CONTRIB/lib/pkgconfig/*.pc); do avlc_pkgconfig --libs $i; done |xargs)
# Lua contrib doesn't expose a pkg-config file with libvlc 3.x and is
# not probed by the previous command in VLC_CONTRIB_LDFLAGS, so probe
# whether it was detected or add it manually to the LDFLAGS.
if ! avlc_pkgconfig --exists lua; then
VLC_CONTRIB_LDFLAGS="$VLC_CONTRIB_LDFLAGS '$VLC_CONTRIB/lib/liblua.a'"
if [ "$AVLC_BUILD_JNI" = "1" ]; then
$LIBVLCJNI_SRC_DIR/buildsystem/build-libvlcjni.sh -a $ANDROID_ABI $LIBVLC_RELEASE
fi
echo -e "ndk-build vlc"
touch $VLC_OUT_PATH/dummy.cpp
$NDK_BUILD -C libvlcjni/libvlc \
APP_STL="c++_shared" \
APP_CPPFLAGS="-frtti -fexceptions" \
VLC_SRC_DIR="$VLC_SRC_DIR" \
VLC_BUILD_DIR="$VLC_BUILD_DIR" \
VLC_CONTRIB="$VLC_CONTRIB" \
VLC_CONTRIB_LDFLAGS="$VLC_CONTRIB_LDFLAGS" \
VLC_MODULES="$VLC_MODULES" \
VLC_LDFLAGS="$VLC_LDFLAGS" \
APP_BUILD_SCRIPT=jni/Android.mk \
APP_PLATFORM=android-${ANDROID_API} \
APP_ABI=${ANDROID_ABI} \
NDK_PROJECT_PATH=jni \
NDK_TOOLCHAIN_VERSION=clang \
NDK_DEBUG=${NDK_DEBUG}
avlc_checkfail "ndk-build libvlc failed"
# Remove gdbserver to avoid conflict with libvlcjni.so debug options
rm -f $VLC_OUT_PATH/libs/${ANDROID_ABI}/gdb*
} # avlc_build()
if [ "$AVLC_SOURCED" != "1" ]; then
......
#! /bin/sh
set -e
LIBVLCJNI_SRC_DIR="$(cd "$(dirname "$0")"; pwd -P)/.."
PATCHES_DIR=$LIBVLCJNI_SRC_DIR/libvlc/patches
#############
# FUNCTIONS #
#############
......@@ -24,7 +26,7 @@ check_patch_is_applied()
{
patch_file=$1
diagnostic "Checking presence of patch $1"
message_id=$(grep -E '^Message-Id: [^ ]+' "$patch_file" | sed 's/^Message-Id: \([^\ ]+\)/\1/')
message_id=$(grep -E '^Message-Id: [^ ]+' "$patch_file" | sed 's/^Message-Id: \([^\ ]\+\)/\1/')
if [ -z "$message_id" ]; then
diagnostic "Error: patch $patch_file does not contain a Message-Id."
diagnostic "Please consider generating your patch files with the 'git format-patch --thread ...' option."
......@@ -67,7 +69,7 @@ done
# Fetch VLC source #
####################
VLC_TESTED_HASH=488ee616e5c94e516563095c6b3ac3a85cf72871
VLC_TESTED_HASH=113e5a86b8801cb5cde1616d4f4da2eb14cbc1a8
VLC_REPOSITORY=https://code.videolan.org/videolan/vlc.git
VLC_BRANCH=master
if [ ! -d "vlc" ]; then
......@@ -78,7 +80,7 @@ if [ ! -d "vlc" ]; then
git reset --hard ${VLC_TESTED_HASH} || fail "VLC sources: VLC_TESTED_HASH ${VLC_TESTED_HASH} not found"
diagnostic "VLC sources: applying custom patches"
# Keep Message-Id inside commits description to track them afterwards
git am --message-id ../libvlcjni/libvlc/patches/*.patch || fail "VLC sources: cannot apply custom patches"
git am --message-id $PATCHES_DIR/*.patch || fail "VLC sources: cannot apply custom patches"
cd ..
else
diagnostic "VLC source: found sources, leaving untouched"
......@@ -88,7 +90,7 @@ if [ "$BYPASS_VLC_SRC_CHECKS" = 1 ]; then
elif [ $RESET -eq 1 ]; then
cd vlc
git reset --hard ${VLC_TESTED_HASH} || fail "VLC sources: VLC_TESTED_HASH ${VLC_TESTED_HASH} not found"
for patch_file in ../libvlcjni/libvlc/patches/*.patch; do
for patch_file in $PATCHES_DIR/*.patch; do
git am --message-id $patch_file
check_patch_is_applied "$patch_file"
done
......@@ -99,7 +101,7 @@ else
cd vlc
git cat-file -e ${VLC_TESTED_HASH} 2> /dev/null || \
fail "Error: Your vlc checkout does not contain the latest tested commit: ${VLC_TESTED_HASH}"
for patch_file in ../libvlcjni/libvlc/patches/*.patch; do
for patch_file in $PATCHES_DIR/*.patch; do
check_patch_is_applied "$patch_file"
done
cd ..
......
......@@ -7,7 +7,7 @@ cache:
default:
interruptible: true
image: registry.videolan.org/vlc-debian-android:20220224093321
image: registry.videolan.org/vlc-debian-android:20250403202200
tags:
- amd64
- docker
......@@ -19,13 +19,12 @@ stages:
.build-libvlc-base:
stage: build
script: |
cd ..
rm -rf vlc-android
git clone --depth=1 https://code.videolan.org/videolan/vlc-android
cd vlc-android
./buildsystem/compile.sh ${EXTRA_BUILD_PARAM} -a ${ARCH}
after_script:
- rm -rf ../vlc-android
rm -rf vlc
./buildsystem/get-vlc.sh
export VLC_CONTRIB_SHA="$(cd vlc && extras/ci/get-contrib-sha.sh android-${ARCH})"
export VLC_PREBUILT_CONTRIBS_URL="https://artifacts.videolan.org/vlc/android-${ARCH}/vlc-contrib-${TRIPLET}-${VLC_CONTRIB_SHA}.tar.bz2"
if vlc/extras/ci/check-url.sh "$VLC_PREBUILT_CONTRIBS_URL"; then CONTRIB_FLAGS="--with-prebuilt-contribs"; fi
./buildsystem/compile-libvlc.sh -a ${ARCH} $CONTRIB_FLAGS
rules:
# Explicitely refuse to build anything that would also trigger
# a medialib build
......@@ -37,9 +36,6 @@ stages:
changes:
- libvlc/**/*
- if: '$CI_PIPELINE_SOURCE == "push"'
variables:
EXTRA_BUILD_PARAM: -l
MAKEFLAGS: -j8
#################################
# Template config instantiation #
......@@ -49,21 +45,25 @@ build-libvlc-arm64:
extends: .build-libvlc-base
variables:
ARCH: arm64
TRIPLET: aarch64-linux-android
build-libvlc-armv7:
extends: .build-libvlc-base
variables:
ARCH: arm
TRIPLET: arm-linux-androideabi
build-libvlc-x86:
extends: .build-libvlc-base
variables:
ARCH: x86
TRIPLET: i686-linux-android
build-libvlc-x86_64:
extends: .build-libvlc-base
variables:
ARCH: x86_64
TRIPLET: x86_64-linux-android
#
.build-release-libs-base:
......
android.useAndroidX=true
\ No newline at end of file
android.useAndroidX=true
POM_URL=https://code.videolan.org/videolan/vlc-android/
POM_SCM_URL=https://code.videolan.org/videolan/vlc-android/
POM_SCM_CONNECTION=scm:git:https://code.videolan.org/videolan/vlc-android.git
POM_SCM_DEV_CONNECTION=scm:git:https://code.videolan.org/videolan/vlc-android.git
POM_LICENCE_NAME=GNU Lesser General Public License, version 2.1
POM_LICENCE_URL=https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html
POM_LICENCE_DIST=repo
POM_DEVELOPER_ID=videolan
POM_DEVELOPER_NAME=VideoLAN
POM_DEVELOPER_URL=https://www.videolan.org/
RELEASE_SIGNING_ENABLED=false
\ No newline at end of file
......@@ -7,6 +7,7 @@ ext {
library_version = "$rootProject.ext.libvlcVersion"
}
android {
namespace 'org.videolan'
defaultConfig {
compileSdkVersion rootProject.ext.compileSdkVersion
......@@ -22,20 +23,17 @@ android {
task.dependsOn luaModuleCopy
}
}
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
sourceSets {
main {
jniLibs.srcDirs = [ 'jni/libs' ]
jniLibs.srcDirs += "$vlcSrcDirs"
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets' ]
}
androidTest {
jniLibs.srcDirs = [ 'jni/libs' ]
jniLibs.srcDirs += "$vlcSrcDirs"
}
}
......@@ -62,27 +60,30 @@ android {
task hrtfsCopy(type: Copy) {
project.logger.lifecycle('hrtfsCopy')
from '../../vlc/share/hrtfs'
from '../vlc/share/hrtfs'
into 'assets/hrtfs'
}
task luaPlaylistCopy(type: Copy) {
from '../../vlc/share/lua/playlist'
from '../vlc/share/lua/playlist'
into 'assets/lua/playlist'
exclude '**/*.txt'
}
task luaModuleCopy(type: Copy) {
from '../../vlc/share/lua/modules'
from '../vlc/share/lua/modules'
into 'assets/lua/modules'
exclude '**/*.txt'
}
task luaMetaCopy(type: Copy) {
from '../../vlc/share/lua/meta'
from '../vlc/share/lua/meta'
into 'assets/lua/meta'
exclude '**/*.txt'
}
buildFeatures {
buildConfig true
}
}
clean {
......@@ -92,6 +93,10 @@ clean {
dependencies {
api "androidx.annotation:annotation:$rootProject.ext.androidxAnnotationVersion"
api "androidx.legacy:legacy-support-v4:$rootProject.ext.androidxLegacyVersion"
testImplementation 'junit:junit:4.13.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
}
def libvlcRevision() {
......@@ -106,14 +111,11 @@ def libvlcRevision() {
def vlcRevision() {
def vlc = new ByteArrayOutputStream()
exec {
commandLine 'sh', '-c', 'cd ../../vlc && git rev-parse --short HEAD'
commandLine 'git', 'rev-parse', '--short', 'HEAD'
workingDir '../vlc'
standardOutput = vlc
}
return vlc.toString()
}
mavenPublish {
releaseSigningEnabled = false
}
apply from: '../../buildsystem/publish.gradle'
apply from: "../publish.gradle"
/* Force ndk build system to link with c++_shared and install it */
/*****************************************************************************
* jni_bindings.h.h
*****************************************************************************
* Copyright © 2023 VLC authors and VideoLAN
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
CLAZZ(IllegalStateException, "java/lang/IllegalStateException")
CLAZZ(IllegalArgumentException, "java/lang/IllegalArgumentException")
CLAZZ(RuntimeException, "java/lang/RuntimeException")
CLAZZ(OutOfMemoryError, "java/lang/OutOfMemoryError")
CLAZZ(String, "java/lang/String")
CLAZZ(FileDescriptor, "java/io/FileDescriptor")
CLAZZ(VLCObject, "org/videolan/libvlc/VLCObject")
CLAZZ(Media, "org/videolan/libvlc/Media")
CLAZZ(Media_Track, "org/videolan/libvlc/interfaces/IMedia$Track")
CLAZZ(Media_Slave, "org/videolan/libvlc/interfaces/IMedia$Slave")
CLAZZ(MediaPlayer, "org/videolan/libvlc/MediaPlayer")
CLAZZ(MediaPlayer_Title, "org/videolan/libvlc/MediaPlayer$Title")
CLAZZ(MediaPlayer_Chapter, "org/videolan/libvlc/MediaPlayer$Chapter")
CLAZZ(MediaPlayer_Equalizer, "org/videolan/libvlc/MediaPlayer$Equalizer")
CLAZZ(MediaDiscoverer, "org/videolan/libvlc/MediaDiscoverer")
CLAZZ(MediaDiscoverer_Description, "org/videolan/libvlc/MediaDiscoverer$Description")
CLAZZ(RendererDiscoverer, "org/videolan/libvlc/RendererDiscoverer")
CLAZZ(RendererDiscoverer_Description, "org/videolan/libvlc/RendererDiscoverer$Description")
CLAZZ(Dialog, "org/videolan/libvlc/Dialog")
FIELD(FileDescriptor, descriptor, "I")
FIELD(VLCObject, mInstance, "J")
METHOD(VLCObject, dispatchEventFromNative, GetMethodID, "(IJJFLjava/lang/String;)V")
METHOD(Media, createAudioTrackFromNative, GetStaticMethodID,
"(Ljava/lang/String;Ljava/lang/String;ZLjava/lang/String;"
"Ljava/lang/String;IIIILjava/lang/String;Ljava/lang/String;II)"
"Lorg/videolan/libvlc/interfaces/IMedia$Track;")
METHOD(Media, createVideoTrackFromNative, GetStaticMethodID,
"(Ljava/lang/String;Ljava/lang/String;ZLjava/lang/String;"
"Ljava/lang/String;IIIILjava/lang/String;Ljava/lang/String;IIIIIIII)"
"Lorg/videolan/libvlc/interfaces/IMedia$Track;")
METHOD(Media, createSubtitleTrackFromNative, GetStaticMethodID,
"(Ljava/lang/String;Ljava/lang/String;ZLjava/lang/String;"
"Ljava/lang/String;IIIILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)"
"Lorg/videolan/libvlc/interfaces/IMedia$Track;")
METHOD(Media, createUnknownTrackFromNative, GetStaticMethodID,
"(Ljava/lang/String;Ljava/lang/String;ZLjava/lang/String;"
"Ljava/lang/String;IIIILjava/lang/String;Ljava/lang/String;)"
"Lorg/videolan/libvlc/interfaces/IMedia$Track;")
METHOD(Media, createSlaveFromNative, GetStaticMethodID,
"(IILjava/lang/String;)"
"Lorg/videolan/libvlc/interfaces/IMedia$Slave;")
METHOD(Media, createStatsFromNative, GetStaticMethodID,
"(JFJFJJJJJJJJJJF)"
"Lorg/videolan/libvlc/interfaces/IMedia$Stats;")
METHOD(MediaPlayer, createTitleFromNative, GetStaticMethodID,
"(JLjava/lang/String;I)Lorg/videolan/libvlc/MediaPlayer$Title;")
METHOD(MediaPlayer, createChapterFromNative, GetStaticMethodID,
"(JJLjava/lang/String;)Lorg/videolan/libvlc/MediaPlayer$Chapter;")
FIELD(MediaPlayer_Equalizer, mInstance, "J")
METHOD(MediaDiscoverer, createDescriptionFromNative, GetStaticMethodID,
"(Ljava/lang/String;Ljava/lang/String;I)"
"Lorg/videolan/libvlc/MediaDiscoverer$Description;")
METHOD(RendererDiscoverer, createDescriptionFromNative, GetStaticMethodID,
"(Ljava/lang/String;Ljava/lang/String;)"
"Lorg/videolan/libvlc/RendererDiscoverer$Description;")
METHOD(RendererDiscoverer, createItemFromNative, GetStaticMethodID,
"(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IJ)"
"Lorg/videolan/libvlc/RendererItem;")
METHOD(Dialog, displayErrorFromNative, GetStaticMethodID,
"(Ljava/lang/String;Ljava/lang/String;)V")
METHOD(Dialog, displayLoginFromNative, GetStaticMethodID,
"(JLjava/lang/String;Ljava/lang/String;Ljava/lang/String;Z)"
"Lorg/videolan/libvlc/Dialog;")
METHOD(Dialog, displayQuestionFromNative, GetStaticMethodID,
"(JLjava/lang/String;Ljava/lang/String;ILjava/lang/String;"
"Ljava/lang/String;Ljava/lang/String;)"
"Lorg/videolan/libvlc/Dialog;")
METHOD(Dialog, displayProgressFromNative, GetStaticMethodID,
"(JLjava/lang/String;Ljava/lang/String;ZFLjava/lang/String;)"
"Lorg/videolan/libvlc/Dialog;")
METHOD(Dialog, cancelFromNative, GetStaticMethodID,
"(Lorg/videolan/libvlc/Dialog;)V")
METHOD(Dialog, updateProgressFromNative, GetStaticMethodID,
"(Lorg/videolan/libvlc/Dialog;FLjava/lang/String;)V")
......@@ -18,12 +18,11 @@ LOCAL_SRC_FILES := $(VLC_BUILD_DIR)/lib/.libs/libvlc.a
LOCAL_STATIC_LIBRARIES := libvlccore
include $(PREBUILT_STATIC_LIBRARY)
# libvlc static build with all its modules
# libvlc build with all its modules
include $(CLEAR_VARS)
LOCAL_MODULE := libvlc
LOCAL_SRC_FILES := $(VLC_BUILD_DIR)/ndk/libvlcjni-modules.c \
$(VLC_BUILD_DIR)/ndk/libvlcjni-symbols.c \
$(VLC_BUILD_DIR)/ndk/dummy.cpp
$(VLC_BUILD_DIR)/ndk/libvlcjni-symbols.c
LOCAL_LDFLAGS := -L$(VLC_CONTRIB)/lib
LOCAL_LDLIBS := \
$(VLC_MODULES) \
......@@ -32,27 +31,10 @@ LOCAL_LDLIBS := \
$(VLC_BUILD_DIR)/compat/.libs/libcompat.a \
$(VLC_CONTRIB_LDFLAGS) \
-ldl -lz -lm -llog \
-la52 -ljpeg \
$(VLC_LDFLAGS) \
-ljpeg \
-Wl,-Bsymbolic
LOCAL_CXXFLAGS := -std=c++11
LOCAL_CXXFLAGS := -std=c++17
# This duplicates the libvlc* link flags, but it propagates the dependency
# on the native build which is what we want overall
LOCAL_STATIC_LIBRARIES := libvlccore libvlccompat libvlc-native
include $(BUILD_SHARED_LIBRARY)
# libvlcjni
include $(CLEAR_VARS)
LOCAL_MODULE := libvlcjni
LOCAL_SRC_FILES := libvlcjni.c
LOCAL_SRC_FILES += libvlcjni-mediaplayer.c
LOCAL_SRC_FILES += libvlcjni-vlcobject.c
LOCAL_SRC_FILES += libvlcjni-media.c libvlcjni-medialist.c libvlcjni-mediadiscoverer.c libvlcjni-rendererdiscoverer.c
LOCAL_SRC_FILES += libvlcjni-dialog.c
LOCAL_SRC_FILES += std_logger.c
LOCAL_C_INCLUDES := $(VLC_SRC_DIR)/include $(VLC_BUILD_DIR)/include
LOCAL_CFLAGS := -std=c11
LOCAL_LDLIBS := -llog
LOCAL_SHARED_LIBRARIES := libvlc
include $(BUILD_SHARED_LIBRARY)
......@@ -52,8 +52,8 @@ display_error_cb(void *p_data, const char *psz_title, const char *psz_text)
jstring title = vlcNewStringUTF(env, psz_title);
jstring text = vlcNewStringUTF(env, psz_text);
(*env)->CallStaticVoidMethod(env, fields.Dialog.clazz,
fields.Dialog.displayErrorFromNativeID, title, text);
(*env)->CallStaticVoidMethod(env, fields.Dialog_clazz,
fields.Dialog_displayErrorFromNative, title, text);
(*env)->DeleteLocalRef(env, title);
(*env)->DeleteLocalRef(env, text);
......@@ -73,8 +73,8 @@ display_login_cb(void *p_data, libvlc_dialog_id *p_id, const char *psz_title,
jstring text = vlcNewStringUTF(env, psz_text);
jstring default_username = vlcNewStringUTF(env, psz_default_username);
jdialog = (*env)->CallStaticObjectMethod(env, fields.Dialog.clazz,
fields.Dialog.displayLoginFromNativeID,
jdialog = (*env)->CallStaticObjectMethod(env, fields.Dialog_clazz,
fields.Dialog_displayLoginFromNative,
(jlong)(intptr_t) p_id, title, text, default_username, b_ask_store);
dialog_set_context(env, p_id, jdialog);
......@@ -100,8 +100,8 @@ display_question_cb(void *p_data, libvlc_dialog_id *p_id, const char *psz_title,
jstring action1 = psz_action1 ? vlcNewStringUTF(env, psz_action1) : NULL;
jstring action2 = psz_action2 ? vlcNewStringUTF(env, psz_action2) : NULL;
jdialog = (*env)->CallStaticObjectMethod(env, fields.Dialog.clazz,
fields.Dialog.displayQuestionFromNativeID,
jdialog = (*env)->CallStaticObjectMethod(env, fields.Dialog_clazz,
fields.Dialog_displayQuestionFromNative,
(jlong)(intptr_t) p_id, title, text, i_type, cancel, action1, action2);
dialog_set_context(env, p_id, jdialog);
......@@ -128,8 +128,8 @@ display_progress_cb(void *p_data, libvlc_dialog_id *p_id, const char *psz_title,
jstring text = vlcNewStringUTF(env, psz_text);
jstring cancel = vlcNewStringUTF(env, psz_cancel);
jdialog = (*env)->CallStaticObjectMethod(env, fields.Dialog.clazz,
fields.Dialog.displayProgressFromNativeID,
jdialog = (*env)->CallStaticObjectMethod(env, fields.Dialog_clazz,
fields.Dialog_displayProgressFromNative,
(jlong)(intptr_t) p_id, title, text, b_indeterminate, f_position, cancel);
dialog_set_context(env, p_id, jdialog);
......@@ -149,8 +149,8 @@ cancel_cb(void *p_data, libvlc_dialog_id *p_id)
if (!(env = jni_get_env(THREAD_NAME)))
return;
(*env)->CallStaticVoidMethod(env, fields.Dialog.clazz,
fields.Dialog.cancelFromNativeID, jdialog);
(*env)->CallStaticVoidMethod(env, fields.Dialog_clazz,
fields.Dialog_cancelFromNative, jdialog);
}
static void
......@@ -167,8 +167,8 @@ update_progress_cb(void *p_data, libvlc_dialog_id *p_id, float f_position,
jstring text = vlcNewStringUTF(env, psz_text);
(*env)->CallStaticVoidMethod(env, fields.Dialog.clazz,
fields.Dialog.updateProgressFromNativeID, jdialog, f_position, text);
(*env)->CallStaticVoidMethod(env, fields.Dialog_clazz,
fields.Dialog_updateProgressFromNative, jdialog, f_position, text);
(*env)->DeleteLocalRef(env, text);
}
......
......@@ -178,7 +178,7 @@ Java_org_videolan_libvlc_Media_nativeNewFromLocation(JNIEnv *env, jobject thiz,
static int
FDObject_getInt(JNIEnv *env, jobject jfd)
{
int fd = (*env)->GetIntField(env, jfd, fields.FileDescriptor.descriptorID);
int fd = (*env)->GetIntField(env, jfd, fields.FileDescriptor_descriptor);
if ((*env)->ExceptionOccurred(env))
{
......@@ -422,8 +422,8 @@ media_track_to_jobject(JNIEnv *env, libvlc_media_track_t *p_tracks)
switch (p_tracks->i_type)
{
case libvlc_track_audio:
jobj = (*env)->CallStaticObjectMethod(env, fields.Media.clazz,
fields.Media.createAudioTrackFromNativeID,
jobj = (*env)->CallStaticObjectMethod(env, fields.Media_clazz,
fields.Media_createAudioTrackFromNative,
jid,
jname,
p_tracks->selected,
......@@ -439,8 +439,8 @@ media_track_to_jobject(JNIEnv *env, libvlc_media_track_t *p_tracks)
(jint)p_tracks->audio->i_rate);
break;
case libvlc_track_video:
jobj = (*env)->CallStaticObjectMethod(env, fields.Media.clazz,
fields.Media.createVideoTrackFromNativeID,
jobj = (*env)->CallStaticObjectMethod(env, fields.Media_clazz,
fields.Media_createVideoTrackFromNative,
jid,
jname,
p_tracks->selected,
......@@ -467,8 +467,8 @@ media_track_to_jobject(JNIEnv *env, libvlc_media_track_t *p_tracks)
if (p_tracks->subtitle->psz_encoding)
jencoding = vlcNewStringUTF(env, p_tracks->subtitle->psz_encoding);
jobj = (*env)->CallStaticObjectMethod(env, fields.Media.clazz,
fields.Media.createSubtitleTrackFromNativeID,
jobj = (*env)->CallStaticObjectMethod(env, fields.Media_clazz,
fields.Media_createSubtitleTrackFromNative,
jid,
jname,
p_tracks->selected,
......@@ -486,8 +486,8 @@ media_track_to_jobject(JNIEnv *env, libvlc_media_track_t *p_tracks)
break;
}
case libvlc_track_unknown:
jobj = (*env)->CallStaticObjectMethod(env, fields.Media.clazz,
fields.Media.createUnknownTrackFromNativeID,
jobj = (*env)->CallStaticObjectMethod(env, fields.Media_clazz,
fields.Media_createUnknownTrackFromNative,
jid,
jname,
p_tracks->selected,
......@@ -524,7 +524,7 @@ tracklist_to_jobjectArray(JNIEnv *env, libvlc_media_tracklist_t *tracklist)
if (track_count == 0)
return NULL;
jobjectArray array = (*env)->NewObjectArray(env, track_count, fields.Media.Track.clazz,
jobjectArray array = (*env)->NewObjectArray(env, track_count, fields.Media_Track_clazz,
NULL);
if (array == NULL)
return NULL;
......@@ -535,6 +535,7 @@ tracklist_to_jobjectArray(JNIEnv *env, libvlc_media_tracklist_t *tracklist)
jobject jtrack = media_track_to_jobject(env, track);
(*env)->SetObjectArrayElement(env, array, i, jtrack);
(*env)->DeleteLocalRef(env, jtrack);
}
return array;
......@@ -697,7 +698,7 @@ Java_org_videolan_libvlc_Media_nativeGetSlaves(JNIEnv *env, jobject thiz)
if (i_slaves == 0)
return NULL;
array = (*env)->NewObjectArray(env, i_slaves, fields.Media.Slave.clazz, NULL);
array = (*env)->NewObjectArray(env, i_slaves, fields.Media_Slave_clazz, NULL);
if (array == NULL)
goto error;
......@@ -707,11 +708,12 @@ Java_org_videolan_libvlc_Media_nativeGetSlaves(JNIEnv *env, jobject thiz)
jstring juri = vlcNewStringUTF(env, p_slave->psz_uri);
jobject jslave =
(*env)->CallStaticObjectMethod(env, fields.Media.clazz,
fields.Media.createSlaveFromNativeID,
(*env)->CallStaticObjectMethod(env, fields.Media_clazz,
fields.Media_createSlaveFromNative,
p_slave->i_type, p_slave->i_priority,
juri);
(*env)->SetObjectArrayElement(env, array, i, jslave);
(*env)->DeleteLocalRef(env, jslave);
(*env)->DeleteLocalRef(env, juri);
}
......@@ -732,8 +734,8 @@ Java_org_videolan_libvlc_Media_nativeGetStats(JNIEnv *env, jobject thiz)
if (i_stats == 0)
return NULL;
return (*env)->CallStaticObjectMethod(env, fields.Media.clazz,
fields.Media.createStatsFromNativeID,
return (*env)->CallStaticObjectMethod(env, fields.Media_clazz,
fields.Media_createStatsFromNative,
stats.i_read_bytes,
stats.f_input_bitrate,
stats.i_demux_read_bytes,
......
......@@ -100,8 +100,8 @@ service_to_object(JNIEnv *env, libvlc_media_discoverer_description_t *p_service)
jname = vlcNewStringUTF(env, p_service->psz_name);
jlongName = vlcNewStringUTF(env, p_service->psz_longname);
jobject jobj = (*env)->CallStaticObjectMethod(env, fields.MediaDiscoverer.clazz,
fields.MediaDiscoverer.createDescriptionFromNativeID,
jobject jobj = (*env)->CallStaticObjectMethod(env, fields.MediaDiscoverer_clazz,
fields.MediaDiscoverer_createDescriptionFromNative,
jname, jlongName, p_service->i_cat);
(*env)->DeleteLocalRef(env, jname);
......@@ -129,7 +129,7 @@ Java_org_videolan_libvlc_MediaDiscoverer_nativeList(JNIEnv *env, jobject thiz,
return NULL;
array = (*env)->NewObjectArray(env, i_nb_services,
fields.MediaDiscoverer.Description.clazz,
fields.MediaDiscoverer_Description_clazz,
NULL);
if (!array)
goto error;
......@@ -139,6 +139,7 @@ Java_org_videolan_libvlc_MediaDiscoverer_nativeList(JNIEnv *env, jobject thiz,
jobject jservice = service_to_object(env, pp_services[i]);
(*env)->SetObjectArrayElement(env, array, i, jservice);
(*env)->DeleteLocalRef(env, jservice);
}
error:
......
......@@ -22,7 +22,6 @@
#include <pthread.h>
#include <stdlib.h>
#include <dlfcn.h>
#include "libvlcjni-vlcobject.h"
......@@ -51,9 +50,7 @@ static const libvlc_event_type_t mp_events[] = {
libvlc_MediaPlayerSeekableChanged,
libvlc_MediaPlayerPausableChanged,
libvlc_MediaPlayerLengthChanged,
#ifdef LIBVLC_MEDIA_PLAYER_HAS_RECORDING
libvlc_MediaPlayerRecordChanged,
#endif
-1,
};
......@@ -74,7 +71,7 @@ Equalizer_getInstance(JNIEnv *env, jobject thiz)
{
intptr_t i_ptr = (intptr_t)
(*env)->GetLongField(env, thiz,
fields.MediaPlayer.Equalizer.mInstanceID);
fields.MediaPlayer_Equalizer_mInstance);
if (!i_ptr)
throw_Exception(env, VLCJNI_EX_ILLEGAL_STATE,
"can't get Equalizer instance");
......@@ -85,7 +82,7 @@ static void
VLCJniObject_setInstance(JNIEnv *env, jobject thiz, libvlc_equalizer_t *p_eq)
{
(*env)->SetLongField(env, thiz,
fields.MediaPlayer.Equalizer.mInstanceID,
fields.MediaPlayer_Equalizer_mInstance,
(jlong)(intptr_t)p_eq);
}
......@@ -133,12 +130,10 @@ MediaPlayer_event_cb(vlcjni_object *p_obj, const libvlc_event_t *p_ev,
case libvlc_MediaPlayerLengthChanged:
p_java_event->arg1 = p_ev->u.media_player_length_changed.new_length;
break;
#ifdef LIBVLC_MEDIA_PLAYER_HAS_RECORDING
case libvlc_MediaPlayerRecordChanged:
p_java_event->arg1 = p_ev->u.media_player_record_changed.recording;
p_java_event->argc1 = p_ev->u.media_player_record_changed.file_path;
p_java_event->argc1 = p_ev->u.media_player_record_changed.recorded_file_path;
break;
#endif
}
p_java_event->type = p_ev->type;
return true;
......@@ -625,8 +620,8 @@ mediaplayer_title_to_object(JNIEnv *env, libvlc_title_description_t *p_title)
if (p_title->psz_name)
jname = vlcNewStringUTF(env, p_title->psz_name);
jobject jobj = (*env)->CallStaticObjectMethod(env, fields.MediaPlayer.clazz,
fields.MediaPlayer.createTitleFromNativeID,
jobject jobj = (*env)->CallStaticObjectMethod(env, fields.MediaPlayer_clazz,
fields.MediaPlayer_createTitleFromNative,
p_title->i_duration,
jname,
p_title->i_flags);
......@@ -653,7 +648,7 @@ Java_org_videolan_libvlc_MediaPlayer_nativeGetTitles(JNIEnv *env, jobject thiz)
return NULL;
array = (*env)->NewObjectArray(env, i_nb_titles,
fields.MediaPlayer.Title.clazz, NULL);
fields.MediaPlayer_Title_clazz, NULL);
if (!array)
goto error;
......@@ -662,7 +657,10 @@ Java_org_videolan_libvlc_MediaPlayer_nativeGetTitles(JNIEnv *env, jobject thiz)
jobject jtitle = mediaplayer_title_to_object(env, pp_titles[i]);
if (jtitle)
{
(*env)->SetObjectArrayElement(env, array, i, jtitle);
(*env)->DeleteLocalRef(env, jtitle);
}
}
error:
......@@ -683,8 +681,8 @@ mediaplayer_chapter_to_object(JNIEnv *env,
if (p_chapter->psz_name)
jname = vlcNewStringUTF(env, p_chapter->psz_name);
jobject jobj = (*env)->CallStaticObjectMethod(env, fields.MediaPlayer.clazz,
fields.MediaPlayer.createChapterFromNativeID,
jobject jobj = (*env)->CallStaticObjectMethod(env, fields.MediaPlayer_clazz,
fields.MediaPlayer_createChapterFromNative,
p_chapter->i_time_offset,
p_chapter->i_duration,
jname);
......@@ -714,7 +712,7 @@ Java_org_videolan_libvlc_MediaPlayer_nativeGetChapters(JNIEnv *env,
return NULL;
array = (*env)->NewObjectArray(env, i_nb_chapters,
fields.MediaPlayer.Chapter.clazz, NULL);
fields.MediaPlayer_Chapter_clazz, NULL);
if (!array)
goto error;
......@@ -723,7 +721,10 @@ Java_org_videolan_libvlc_MediaPlayer_nativeGetChapters(JNIEnv *env,
jobject jchapter = mediaplayer_chapter_to_object(env, pp_chapters[i]);
if (jchapter)
{
(*env)->SetObjectArrayElement(env, array, i, jchapter);
(*env)->DeleteLocalRef(env, jchapter);
}
}
error:
......@@ -1031,7 +1032,7 @@ Java_org_videolan_libvlc_MediaPlayer_nativeSetEqualizer(JNIEnv *env,
jboolean
Java_org_videolan_libvlc_MediaPlayer_nativeRecord(JNIEnv *env, jobject thiz,
jstring jdirectory)
jstring jdirectory, jboolean enable)
{
vlcjni_object *p_obj = VLCJniObject_getInstance(env, thiz);
const char *psz_directory;
......@@ -1039,12 +1040,6 @@ Java_org_videolan_libvlc_MediaPlayer_nativeRecord(JNIEnv *env, jobject thiz,
if (!p_obj)
return false;
int (*record_func)(libvlc_media_player_t *, const char *) =
dlsym(RTLD_DEFAULT, "libvlc_media_player_record");
if (!record_func)
return false;
if (jdirectory)
{
psz_directory = (*env)->GetStringUTFChars(env, jdirectory, 0);
......@@ -1057,14 +1052,14 @@ Java_org_videolan_libvlc_MediaPlayer_nativeRecord(JNIEnv *env, jobject thiz,
else
psz_directory = NULL;
jboolean ret = record_func(p_obj->u.p_mp, psz_directory) == 0;
libvlc_media_player_record(p_obj->u.p_mp, enable, psz_directory);
if (psz_directory)
{
(*env)->ReleaseStringUTFChars(env, jdirectory, psz_directory);
}
return ret;
return true;
}
jint
......@@ -1195,3 +1190,51 @@ Java_org_videolan_libvlc_MediaPlayer_00024Equalizer_nativeSetAmp(JNIEnv *env,
return libvlc_audio_equalizer_set_amp_at_index(p_eq, amp, index) == 0 ? true : false;
}
void
Java_org_videolan_libvlc_MediaPlayer_nativeSetTeletext(JNIEnv *env,
jobject thiz,
jint page)
{
vlcjni_object *p_obj = VLCJniObject_getInstance(env, thiz);
if (!p_obj)
return;
libvlc_video_set_teletext(p_obj->u.p_mp, page);
}
jint
Java_org_videolan_libvlc_MediaPlayer_nativeGetTeletext(JNIEnv *env,
jobject thiz)
{
vlcjni_object *p_obj = VLCJniObject_getInstance(env, thiz);
if (!p_obj)
return 100;
return libvlc_video_get_teletext(p_obj->u.p_mp);
}
void
Java_org_videolan_libvlc_MediaPlayer_nativeSetTeletextTransparency(JNIEnv *env,
jobject thiz,
jboolean transparent)
{
vlcjni_object *p_obj = VLCJniObject_getInstance(env, thiz);
if (!p_obj)
return;
libvlc_video_set_teletext_transparency (p_obj->u.p_mp, transparent);
}
jboolean
Java_org_videolan_libvlc_MediaPlayer_nativeGetTeletextTransparency(JNIEnv *env,
jobject thiz)
{
vlcjni_object *p_obj = VLCJniObject_getInstance(env, thiz);
if (!p_obj)
return false;
return !!libvlc_video_get_teletext_transparency (p_obj->u.p_mp);
}
......@@ -126,8 +126,8 @@ service_to_object(JNIEnv *env, libvlc_rd_description_t *p_service)
jname = vlcNewStringUTF(env, p_service->psz_name);
jlongName = vlcNewStringUTF(env, p_service->psz_longname);
jobject jobj = (*env)->CallStaticObjectMethod(env, fields.RendererDiscoverer.clazz,
fields.RendererDiscoverer.createDescriptionFromNativeID,
jobject jobj = (*env)->CallStaticObjectMethod(env, fields.RendererDiscoverer_clazz,
fields.RendererDiscoverer_createDescriptionFromNative,
jname, jlongName);
(*env)->DeleteLocalRef(env, jname);
......@@ -149,8 +149,8 @@ item_to_object(JNIEnv *env, libvlc_renderer_item_t *p_item)
jIconUri = vlcNewStringUTF(env, libvlc_renderer_item_icon_uri(p_item));
jFlags = libvlc_renderer_item_flags(p_item);
jobject jobj = (*env)->CallStaticObjectMethod(env, fields.RendererDiscoverer.clazz,
fields.RendererDiscoverer.createItemFromNativeID,
jobject jobj = (*env)->CallStaticObjectMethod(env, fields.RendererDiscoverer_clazz,
fields.RendererDiscoverer_createItemFromNative,
jname, jType, jIconUri, jFlags, (jlong) p_item);
(*env)->DeleteLocalRef(env, jname);
......@@ -178,7 +178,7 @@ Java_org_videolan_libvlc_RendererDiscoverer_nativeList(JNIEnv *env, jobject thiz
return NULL;
array = (*env)->NewObjectArray(env, i_nb_services,
fields.RendererDiscoverer.Description.clazz,
fields.RendererDiscoverer_Description_clazz,
NULL);
if (!array)
goto error;
......@@ -188,6 +188,7 @@ Java_org_videolan_libvlc_RendererDiscoverer_nativeList(JNIEnv *env, jobject thiz
jobject jservice = service_to_object(env, pp_services[i]);
(*env)->SetObjectArrayElement(env, array, i, jservice);
(*env)->DeleteLocalRef(env, jservice);
}
error:
......
......@@ -42,7 +42,7 @@ static vlcjni_object *
VLCJniObject_getInstanceInternal(JNIEnv *env, jobject thiz)
{
return (vlcjni_object*)(intptr_t) (*env)->GetLongField(env, thiz,
fields.VLCObject.mInstanceID);
fields.VLCObject_mInstance);
}
vlcjni_object *
......@@ -60,7 +60,7 @@ static void
VLCJniObject_setInstance(JNIEnv *env, jobject thiz, vlcjni_object *p_obj)
{
(*env)->SetLongField(env, thiz,
fields.VLCObject.mInstanceID,
fields.VLCObject_mInstance,
(jlong)(intptr_t)p_obj);
}
......@@ -177,7 +177,7 @@ VLCJniObject_eventCallback(const libvlc_event_t *ev, void *data)
if (p_obj->p_owner->weak)
(*env)->CallVoidMethod(env, p_obj->p_owner->weak,
fields.VLCObject.dispatchEventFromNativeID,
fields.VLCObject_dispatchEventFromNative,
jevent.type, jevent.arg1, jevent.arg2,
jevent.argf1, string);
if (string)
......
......@@ -119,17 +119,17 @@ static inline void throw_Exception(JNIEnv *env, enum vlcjni_exception type,
switch (type)
{
case VLCJNI_EX_ILLEGAL_STATE:
clazz = fields.IllegalStateException.clazz;
clazz = fields.IllegalStateException_clazz;
break;
case VLCJNI_EX_RUNTIME:
clazz = fields.RuntimeException.clazz;
clazz = fields.RuntimeException_clazz;
break;
case VLCJNI_EX_OUT_OF_MEMORY:
clazz = fields.OutOfMemoryError.clazz;
clazz = fields.OutOfMemoryError_clazz;
break;
case VLCJNI_EX_ILLEGAL_ARGUMENT:
default:
clazz = fields.IllegalArgumentException.clazz;
clazz = fields.IllegalArgumentException_clazz;
break;
}
(*env)->ThrowNew(env, clazz, error ? error : fmt);
......
......@@ -117,20 +117,17 @@ jint JNI_OnLoad(JavaVM *vm, void *reserved)
p_std_logger = std_logger_Open("VLC-std");
#endif
#define GET_CLASS(clazz, str, b_globlal) do { \
(clazz) = (*env)->FindClass(env, (str)); \
if (!(clazz)) { \
#define GET_CLASS(clazz, str) do { \
jclass local_class = (*env)->FindClass(env, (str)); \
if (!local_class) { \
LOGE("FindClass(%s) failed", (str)); \
return -1; \
} \
if (b_globlal) { \
jclass local_class = (clazz); \
(clazz) = (jclass) (*env)->NewGlobalRef(env, (clazz)); \
(*env)->DeleteLocalRef(env, local_class); \
if (!(clazz)) { \
LOGE("NewGlobalRef(%s) failed", (str)); \
return -1; \
} \
(clazz) = (jclass) (*env)->NewGlobalRef(env, local_class); \
(*env)->DeleteLocalRef(env, local_class); \
if (!(clazz)) { \
LOGE("NewGlobalRef(%s) failed", (str)); \
return -1; \
} \
} while (0)
......@@ -142,187 +139,16 @@ jint JNI_OnLoad(JavaVM *vm, void *reserved)
} \
} while (0)
jclass Version_clazz;
jfieldID SDK_INT_fieldID;
GET_CLASS(Version_clazz, "android/os/Build$VERSION", false);
GET_ID(GetStaticFieldID, SDK_INT_fieldID, Version_clazz, "SDK_INT", "I");
fields.SDK_INT = (*env)->GetStaticIntField(env, Version_clazz,
SDK_INT_fieldID);
(*env)->DeleteLocalRef(env, Version_clazz);
GET_CLASS(fields.IllegalStateException.clazz,
"java/lang/IllegalStateException", true);
GET_CLASS(fields.IllegalArgumentException.clazz,
"java/lang/IllegalArgumentException", true);
GET_CLASS(fields.RuntimeException.clazz,
"java/lang/RuntimeException", true);
GET_CLASS(fields.OutOfMemoryError.clazz,
"java/lang/OutOfMemoryError", true);
GET_CLASS(fields.String.clazz,
"java/lang/String", true);
GET_CLASS(fields.FileDescriptor.clazz,
"java/io/FileDescriptor", true);
GET_ID(GetFieldID,
fields.FileDescriptor.descriptorID,
fields.FileDescriptor.clazz,
"descriptor", "I");
GET_CLASS(fields.VLCObject.clazz,
"org/videolan/libvlc/VLCObject", true);
GET_CLASS(fields.Media.clazz,
"org/videolan/libvlc/Media", true);
GET_CLASS(fields.Media.Track.clazz,
"org/videolan/libvlc/interfaces/IMedia$Track", true);
GET_CLASS(fields.Media.Slave.clazz,
"org/videolan/libvlc/interfaces/IMedia$Slave", true);
GET_CLASS(fields.MediaPlayer.clazz,
"org/videolan/libvlc/MediaPlayer", true);
GET_CLASS(fields.MediaPlayer.Title.clazz,
"org/videolan/libvlc/MediaPlayer$Title", true);
GET_CLASS(fields.MediaPlayer.Chapter.clazz,
"org/videolan/libvlc/MediaPlayer$Chapter", true);
GET_CLASS(fields.MediaPlayer.Equalizer.clazz,
"org/videolan/libvlc/MediaPlayer$Equalizer", true);
GET_CLASS(fields.MediaDiscoverer.clazz,
"org/videolan/libvlc/MediaDiscoverer", true);
GET_CLASS(fields.MediaDiscoverer.Description.clazz,
"org/videolan/libvlc/MediaDiscoverer$Description", true);
GET_CLASS(fields.RendererDiscoverer.clazz,
"org/videolan/libvlc/RendererDiscoverer", true);
GET_CLASS(fields.RendererDiscoverer.Description.clazz,
"org/videolan/libvlc/RendererDiscoverer$Description", true);
GET_CLASS(fields.Dialog.clazz,
"org/videolan/libvlc/Dialog", true);
GET_ID(GetFieldID,
fields.VLCObject.mInstanceID,
fields.VLCObject.clazz,
"mInstance", "J");
GET_ID(GetFieldID,
fields.MediaPlayer.Equalizer.mInstanceID,
fields.MediaPlayer.Equalizer.clazz,
"mInstance", "J");
GET_ID(GetMethodID,
fields.VLCObject.dispatchEventFromNativeID,
fields.VLCObject.clazz,
"dispatchEventFromNative", "(IJJFLjava/lang/String;)V");
GET_ID(GetStaticMethodID,
fields.Media.createAudioTrackFromNativeID,
fields.Media.clazz,
"createAudioTrackFromNative",
"(Ljava/lang/String;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;IIIILjava/lang/String;Ljava/lang/String;II)"
"Lorg/videolan/libvlc/interfaces/IMedia$Track;");
GET_ID(GetStaticMethodID,
fields.Media.createVideoTrackFromNativeID,
fields.Media.clazz,
"createVideoTrackFromNative",
"(Ljava/lang/String;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;IIIILjava/lang/String;Ljava/lang/String;IIIIIIII)"
"Lorg/videolan/libvlc/interfaces/IMedia$Track;");
GET_ID(GetStaticMethodID,
fields.Media.createSubtitleTrackFromNativeID,
fields.Media.clazz,
"createSubtitleTrackFromNative",
"(Ljava/lang/String;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;IIIILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)"
"Lorg/videolan/libvlc/interfaces/IMedia$Track;");
GET_ID(GetStaticMethodID,
fields.Media.createUnknownTrackFromNativeID,
fields.Media.clazz,
"createUnknownTrackFromNative",
"(Ljava/lang/String;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;IIIILjava/lang/String;Ljava/lang/String;)"
"Lorg/videolan/libvlc/interfaces/IMedia$Track;");
GET_ID(GetStaticMethodID,
fields.Media.createSlaveFromNativeID,
fields.Media.clazz,
"createSlaveFromNative",
"(IILjava/lang/String;)"
"Lorg/videolan/libvlc/interfaces/IMedia$Slave;");
GET_ID(GetStaticMethodID,
fields.Media.createStatsFromNativeID,
fields.Media.clazz,
"createStatsFromNative",
"(IFIFIIIIIIIIIIF)"
"Lorg/videolan/libvlc/interfaces/IMedia$Stats;");
GET_ID(GetStaticMethodID,
fields.MediaPlayer.createTitleFromNativeID,
fields.MediaPlayer.clazz,
"createTitleFromNative",
"(JLjava/lang/String;I)Lorg/videolan/libvlc/MediaPlayer$Title;");
GET_ID(GetStaticMethodID,
fields.MediaPlayer.createChapterFromNativeID,
fields.MediaPlayer.clazz,
"createChapterFromNative",
"(JJLjava/lang/String;)Lorg/videolan/libvlc/MediaPlayer$Chapter;");
GET_ID(GetStaticMethodID,
fields.MediaDiscoverer.createDescriptionFromNativeID,
fields.MediaDiscoverer.clazz,
"createDescriptionFromNative",
"(Ljava/lang/String;Ljava/lang/String;I)"
"Lorg/videolan/libvlc/MediaDiscoverer$Description;");
GET_ID(GetStaticMethodID,
fields.RendererDiscoverer.createDescriptionFromNativeID,
fields.RendererDiscoverer.clazz,
"createDescriptionFromNative",
"(Ljava/lang/String;Ljava/lang/String;)"
"Lorg/videolan/libvlc/RendererDiscoverer$Description;");
GET_ID(GetStaticMethodID,
fields.RendererDiscoverer.createItemFromNativeID,
fields.RendererDiscoverer.clazz,
"createItemFromNative",
"(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IJ)"
"Lorg/videolan/libvlc/RendererItem;");
GET_ID(GetStaticMethodID,
fields.Dialog.displayErrorFromNativeID,
fields.Dialog.clazz,
"displayErrorFromNative",
"(Ljava/lang/String;Ljava/lang/String;)V");
GET_ID(GetStaticMethodID,
fields.Dialog.displayLoginFromNativeID,
fields.Dialog.clazz,
"displayLoginFromNative",
"(JLjava/lang/String;Ljava/lang/String;Ljava/lang/String;Z)"
"Lorg/videolan/libvlc/Dialog;");
GET_ID(GetStaticMethodID,
fields.Dialog.displayQuestionFromNativeID,
fields.Dialog.clazz,
"displayQuestionFromNative",
"(JLjava/lang/String;Ljava/lang/String;ILjava/lang/String;"
"Ljava/lang/String;Ljava/lang/String;)"
"Lorg/videolan/libvlc/Dialog;");
GET_ID(GetStaticMethodID,
fields.Dialog.displayProgressFromNativeID,
fields.Dialog.clazz,
"displayProgressFromNative",
"(JLjava/lang/String;Ljava/lang/String;ZFLjava/lang/String;)"
"Lorg/videolan/libvlc/Dialog;");
GET_ID(GetStaticMethodID,
fields.Dialog.cancelFromNativeID,
fields.Dialog.clazz,
"cancelFromNative",
"(Lorg/videolan/libvlc/Dialog;)V");
GET_ID(GetStaticMethodID,
fields.Dialog.updateProgressFromNativeID,
fields.Dialog.clazz,
"updateProgressFromNative",
"(Lorg/videolan/libvlc/Dialog;FLjava/lang/String;)V");
#define CLAZZ(name, fullname) \
GET_CLASS(fields.name##_clazz, fullname);
#define FIELD(clazz, name, args) \
GET_ID(GetFieldID, fields.clazz##_##name, fields.clazz##_clazz, #name, args);
#define METHOD(clazz, name, get_type, args) \
GET_ID(get_type, fields.clazz##_##name, fields.clazz##_clazz, #name, args);
#include "jni_bindings.h"
#undef CLAZZ
#undef FIELD
#undef METHOD
#undef GET_CLASS
#undef GET_ID
......@@ -338,25 +164,14 @@ void JNI_OnUnload(JavaVM* vm, void* reserved)
if ((*vm)->GetEnv(vm, (void**) &env, VLC_JNI_VERSION) != JNI_OK)
return;
(*env)->DeleteGlobalRef(env, fields.IllegalStateException.clazz);
(*env)->DeleteGlobalRef(env, fields.IllegalArgumentException.clazz);
(*env)->DeleteGlobalRef(env, fields.RuntimeException.clazz);
(*env)->DeleteGlobalRef(env, fields.OutOfMemoryError.clazz);
(*env)->DeleteGlobalRef(env, fields.String.clazz);
(*env)->DeleteGlobalRef(env, fields.FileDescriptor.clazz);
(*env)->DeleteGlobalRef(env, fields.VLCObject.clazz);
(*env)->DeleteGlobalRef(env, fields.Media.clazz);
(*env)->DeleteGlobalRef(env, fields.Media.Track.clazz);
(*env)->DeleteGlobalRef(env, fields.Media.Slave.clazz);
(*env)->DeleteGlobalRef(env, fields.MediaPlayer.clazz);
(*env)->DeleteGlobalRef(env, fields.MediaPlayer.Title.clazz);
(*env)->DeleteGlobalRef(env, fields.MediaPlayer.Chapter.clazz);
(*env)->DeleteGlobalRef(env, fields.MediaPlayer.Equalizer.clazz);
(*env)->DeleteGlobalRef(env, fields.MediaDiscoverer.clazz);
(*env)->DeleteGlobalRef(env, fields.MediaDiscoverer.Description.clazz);
(*env)->DeleteGlobalRef(env, fields.RendererDiscoverer.clazz);
(*env)->DeleteGlobalRef(env, fields.RendererDiscoverer.Description.clazz);
(*env)->DeleteGlobalRef(env, fields.Dialog.clazz);
#define CLAZZ(name, fullname) \
(*env)->DeleteGlobalRef(env, fields.name##_clazz);
#define FIELD(clazz, name, args)
#define METHOD(clazz, name, get_type, args)
#include "jni_bindings.h"
#undef CLAZZ
#undef FIELD
#undef METHOD
pthread_key_delete(jni_env_key);
......