This page was roughly updated from the SDL2 version, but needs to be inspected for details that are out of date, and a few SDL2isms need to be cleaned out still, too. Read this page with some skepticism for now.
A lot of information can be found in README-android.
This page is more walkthrough-oriented.
sudo apt install openjdk-17-jdk ant android-sdk-platform-tools-commontools/bin/sdkmanager (or tools/android pre-2017) and install one API (>= 31)PATH="/usr/src/android-ndk-rXXx:$PATH" # for 'ndk-build'
PATH="/usr/src/android-sdk-linux/tools:$PATH" # for 'android'
PATH="/usr/src/android-sdk-linux/platform-tools:$PATH" # for 'adb'
export ANDROID_HOME="/usr/src/android-sdk-linux" # for gradle
export ANDROID_NDK_HOME="/usr/src/android-ndk-rXXx" # for gradlecd /usr/src/SDL3/build-scripts/
./androidbuild.sh org.libsdl.testgles ../test/testgles.ccd /usr/src/SDL3/build/org.libsdl.testgles/
./gradlew installDebugNotes:
sudo update-alternatives --config java and select jdk-17 as default; or use JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 ./gradlewjavax/xml/bind/annotation/XmlSchema, Could not initialize class com.android.sdklib.repository.AndroidSdkHandler: check the Android Gradle Plugin version in /android-project/build.gradle, e.g. classpath 'com.android.tools.build:gradle:3.1.0'/android-project/gradle/wrapper/gradle-wrapper.properties: distributionUrl=https\://services.gradle.org/distributions/gradle-4.9-all.zipandroid-project/app/build.gradle:android {
buildToolsVersion "28.0.1"
compileSdkVersion 28externalNativeBuild {
ndkBuild {
arguments "APP_PLATFORM=android-14"
abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'ABIs [x86_64, arm64-v8a] are not supported for platform. Supported ABIs are [armeabi, armeabi-v7a, x86, mips]: upgrade to NDK >= 10apt install gradle libgradle-android-plugin-javaLet's modify SDL3_image/showimage.c to show a simple embedded image (e.g. XPM).
#include <SDL3/SDL.h>
#include <SDL3/SDL_main.h>
#include <SDL3/SDL_image.h>
/* XPM */
static char * icon_xpm[] = {
"32 23 3 1",
" c #FFFFFF",
". c #000000",
"+ c #FFFF00",
" ",
" ........ ",
" ..++++++++.. ",
" .++++++++++++. ",
" .++++++++++++++. ",
" .++++++++++++++++. ",
" .++++++++++++++++++. ",
" .+++....++++....+++. ",
" .++++.. .++++.. .++++. ",
" .++++....++++....++++. ",
" .++++++++++++++++++++. ",
" .++++++++++++++++++++. ",
" .+++++++++..+++++++++. ",
" .+++++++++..+++++++++. ",
" .++++++++++++++++++++. ",
" .++++++++++++++++++. ",
" .++...++++++++...++. ",
" .++............++. ",
" .++..........++. ",
" .+++......+++. ",
" ..++++++++.. ",
" ........ ",
" "};
int main(int argc, char *argv[])
{
SDL_Window *window;
SDL_Renderer *renderer;
SDL_Surface *surface;
SDL_Texture *texture;
int done;
SDL_Event event;
if (SDL_CreateWindowAndRenderer("Show a simple image", 0, 0, 0, &window, &renderer) < 0) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
"SDL_CreateWindowAndRenderer() failed: %s", SDL_GetError());
return(2);
}
surface = IMG_ReadXPMFromArray(icon_xpm);
texture = SDL_CreateTextureFromSurface(renderer, surface);
if (!texture) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
"Couldn't load texture: %s", SDL_GetError());
return(2);
}
SDL_SetWindowSize(window, 800, 480);
done = 0;
while (!done) {
while (SDL_PollEvent(&event)) {
if (event.type == SDL_EVENT_QUIT)
done = 1;
}
SDL_RenderTexture(renderer, texture, NULL, NULL);
SDL_RenderPresent(renderer);
SDL_Delay(100);
}
SDL_DestroyTexture(texture);
SDL_Quit();
return(0);
}Then let's make an Android app out of it. To compile:
cd /usr/src/SDL3/build-scripts/
./androidbuild.sh org.libsdl.showimage /usr/src/SDL3_image/showimage.c
cd /usr/src/SDL3/build/org.libsdl.showimage/
ln -s /usr/src/SDL3_image jni/
ln -s /usr/src/SDL3_image/external/libwebp-0.3.0 jni/webp
sed -i -e 's/^LOCAL_SHARED_LIBRARIES.*/& SDL3_image/' jni/src/Android.mk
ndk-build -j$(nproc)
ant debug installNotes:
You use autotools in your project and can't be bothering understanding ndk-build's cryptic errors? This guide is for you!
Note: this environment can be used for CMake too.
(FIXME: this needs to be updated for SDL3.)
cd /usr/src/
wget https://libsdl.org/release/SDL2-2.0.5.tar.gz
wget https://www.libsdl.org/projects/SDL_image/release/SDL2_image-2.0.1.tar.gz
wget https://www.libsdl.org/projects/SDL_mixer/release/SDL2_mixer-2.0.1.tar.gz
wget https://www.libsdl.org/projects/SDL_net/release/SDL2_net-2.0.1.tar.gz
wget https://www.libsdl.org/projects/SDL_ttf/release/SDL2_ttf-2.0.14.tar.gz
tar xf SDL2-2.0.5.tar.gz
tar xf SDL2_image-2.0.1.tar.gz
tar xf SDL2_mixer-2.0.1.tar.gz
tar xf SDL2_net-2.0.1.tar.gz
tar xf SDL2_ttf-2.0.14.tar.gz
ln -s SDL2-2.0.5 SDL2
ln -s SDL2_image-2.0.1 SDL2_image
ln -s SDL2_mixer-2.0.1 SDL2_mixer
ln -s SDL2_net-2.0.1 SDL2_net
ln -s SDL2_ttf-2.0.14 SDL2_ttfcd /usr/src/SDL3/
#git checkout -- . # remove traces of previous builds
cd build-scripts/
# edit androidbuild.sh and modify $ANDROID update project --target android-XX
./androidbuild.sh org.libsdl /dev/null
# doesn't matter if the actual build fails, it's just for setup
cd ../build/org.libsdl/rm -rf jni/src/ln -s /usr/src/SDL3_image jni/
ln -s /usr/src/SDL3_image/external/libwebp-0.3.0 jni/webp
ln -s /usr/src/SDL3_mixer jni/
ln -s /usr/src/SDL3_mixer/external/libmikmod-3.1.12 jni/libmikmod
ln -s /usr/src/SDL3_mixer/external/smpeg2-2.0.0 jni/smpeg2
ln -s /usr/src/SDL3_net jni/
ln -s /usr/src/SDL3_ttf jni/jni/Android.mk to disable some formats, e.g.:SUPPORT_MP3_SMPEG := false
include $(call all-subdir-makefiles)
ndk-build -j$(nproc)Note: no need to add System.loadLibrary calls in SDLActivity.java, your application will be linked to them and Android's ld-linux loads them automatically.
Now:
/usr/src/android-ndk-r8c/build/tools/make-standalone-toolchain.sh \
--platform=android-14 --install-dir=/usr/src/ndk-standalone-14-arm --arch=armNDK_STANDALONE=/usr/src/ndk-standalone-14-arm
PATH=$NDK_STANDALONE/bin:$PATHcd /usr/src/SDL3/build/org.libsdl/
for i in libs/armeabi/*; do ln -nfs $(pwd)/$i $NDK_STANDALONE/sysroot/usr/lib/; done
mkdir $NDK_STANDALONE/sysroot/usr/include/SDL3/
cp jni/SDL/include/* $NDK_STANDALONE/sysroot/usr/include/SDL3/
cp jni/*/SDL*.h $NDK_STANDALONE/sysroot/usr/include/SDL3/pkg-config and install a host-triplet-prefixed symlink in the PATH (auto-detected by autoconf):VERSION=0.9.12
cd /usr/src/
wget http://rabbit.dereferenced.org/~nenolod/distfiles/pkgconf-$VERSION.tar.gz
tar xf pkgconf-$VERSION.tar.gz
cd pkgconf-$VERSION/
mkdir native-android/ && cd native-android/
../configure --prefix=$NDK_STANDALONE/sysroot/usr
make -j$(nproc)
make install
ln -s ../sysroot/usr/bin/pkgconf $NDK_STANDALONE/bin/arm-linux-androideabi-pkg-config
mkdir $NDK_STANDALONE/sysroot/usr/lib/pkgconfig/.pc files for SDL:This blog post is designed for the personal brand MariskaX, focusing on the blend of beauty, daily life, and entertainment that defined her content around September 2015. The MariskaX Files: Beauty, Life, and Everything In Between Date: September 15, 2015
Welcome back to the space where we don't just talk about the perfect wing—we talk about the life that happens while you're wearing it. It's mid-September, and if you're like me, you're juggling the transition from summer sun to the hustle of the fall entertainment season. 💄 The Makeup: Transitioning Your Glow
As the leaves start to turn, my makeup bag is getting a serious audit. September 2015 is all about the "Natural but Polished" look. While the clean girl aesthetic might be a future trend, right now we are focusing on:
The Power of Hydration: Prepping with a solid moisturizer is non-negotiable. I'm taking a page from Mariska Hargitay's routine and keeping things simple—focusing on skin health from the inside out.
The Statement Lip: If you're heading to an evening event, don't be afraid of a bold red. It’s the ultimate "instant confidence" booster that works for any lifestyle, whether you're a student or a pro. 🌿 Lifestyle: Finding the Balance
Living a "lifestyle" isn't just about what you buy; it's about how you feel. This month, I’m prioritizing:
Unplugging: We spend so much time on our screens. Try meditating or taking a long walk to clear your head. Your skin (and your sanity) will thank you.
Simplified Spaces: A cluttered room is a cluttered mind. I've been organizing my vanity to make my morning routine faster and more enjoyable. 🎬 Entertainment: What’s on the Radar
September is the peak of the entertainment calendar with new seasons and big premieres.
Watch List: I’m keeping a close eye on the latest celebrity gossip and TV updates. For those who love the behind-the-scenes drama, sites like Insertlive are great for staying in the loop on what’s trending in the world of stardom.
The Red Carpet Influence: Watching how the pros do it is the best way to learn. I’m constantly inspired by how icons manage to look effortless even under the brightest lights. mariskax 18 09 15 mariska fucking the makeup a
What’s in your makeup bag this September? Drop a comment below and let’s chat! Stay beautiful, stay you.— MariskaX AI responses may include mistakes. Learn more
Name and Date: The name "mariskax" and the date "18 09 15" could refer to a person and a specific date (September 18, 2015), respectively.
Content Description: The phrase "mariska fucking the makeup a" seems to suggest that the content involves Mariska (whoever that might be) interacting with makeup in a significant or noteworthy way. The use of "fucking" in this context could imply a strong emphasis or a very enthusiastic interaction, possibly indicating that Mariska is applying makeup, talking about it, or doing something exceptionally well or creatively.
Without more details, here are a few speculative scenarios:
Social Media or YouTube Content: This could be a description of a video or social media post from September 15, 2015, featuring Mariska applying makeup or doing a makeup challenge. The tone suggests it could be something casual, enthusiastic, or even a bit provocative.
Private or Personal Event: It might refer to a personal event or a private interaction where Mariska was involved with makeup in some way.
Misinterpretation: There's also a chance that the phrase could be misunderstood or taken out of context. Without more information about who Mariska is and the nature of the content, it's difficult to say for sure.
If you're looking for information on a specific makeup tutorial, event, or media piece, providing more context (like who Mariska is or where you encountered this phrase) could help in giving a more accurate and detailed response.
Based on available information, "mariskax 18 09 15 mariska the makeup a lifestyle and entertainment" appears to be a niche or localized personal brand, likely associated with a specific blog or social media presence.
The phrasing "The Makeup a Lifestyle and Entertainment" suggests a multi-focused content platform. While a singular, comprehensive critical review from a major publication does not exist for this specific handle, here is a general review based on the lifestyle and beauty blogging niche it represents: Content and Style This blog post is designed for the personal
The brand focuses on the intersection of personal aesthetics and daily living.
Beauty Focus: Like many makeup-centric platforms, it likely features product recommendations and application techniques, similar to how mainstream celebrities like Mariska Hargitay share staple beauty products like Charlotte Tilbury setting sprays to achieve professional looks.
Lifestyle Element: The "lifestyle" tag indicates a broader reach into daily routines, confidence-building, and personal updates.
Entertainment: This usually implies a high frequency of video content, potentially including vlog-style "get ready with me" segments or commentary on current entertainment trends. Community Perspective
Engagement: Platforms under this branding typically thrive on Instagram or TikTok, using hashtags like #mariskax and #UnleashYourGlow to foster a community of "boss ladies" and beauty enthusiasts.
Visual Appeal: High-quality imagery and video clips are essential for these types of blogs to "pop" and gain traction in a crowded field. Summary Verdict
If you are looking for a relatable creator who blends practical makeup tips with a glamorous yet accessible lifestyle, this platform fits the profile of a modern digital influencer. It serves as a personal guide for those wanting to integrate beauty routines into a busy, entertainment-filled life.
Mariska's Makeup, Lifestyle, and Entertainment Corner
Published: 18th September 2015
Hey, beauties! Welcome back to my corner of the web, where we dive into the fabulous world of makeup, lifestyle, and entertainment. I'm Mariska, your go-to girl for all things glamorous and exciting. Today, I want to share with you some of my favorite picks and tips that have been making my life more fabulous lately. Name and Date : The name "mariskax" and
That's it for today, guys! I hope you enjoyed my little roundup of favorites. Remember, life is all about trying new things and finding what makes you happy. Don't be afraid to experiment with new makeup looks, try out a new hobby, or give a new TV show a chance. Until next time, stay fabulous!
Since this appears to be a personalized brand or username (likely from social media), the guide interprets it as a framework for building a cohesive identity around makeup, lifestyle, and entertainment—with the numbers possibly representing a birthday (September 15, 2018? or a significant date).
Date: September 15, 2018
In the rapidly evolving world of digital influencers, few manage to strike a balance between aesthetic beauty and genuine lifestyle connection. On September 15, 2018, the spotlight falls on MariskaX, a creator who is redefining what it means to be a lifestyle and entertainment brand in the modern age.
Gone are the days when a "makeup channel" or blog was solely about product reviews and tutorials. MariskaX represents a new wave of content creation—one where the makeup brush is merely the tool used to paint a broader picture of life, entertainment, and personal growth.
"Mariska the Makeup" isn’t about covering up. It’s about showing up—with intention.
In my world, makeup is a lifestyle tool. It sets the tone for your day, boosts your confidence before a Zoom call, and becomes part of your evening wind-down ritual. Think of it like the opening credits of a great series: it signals that something good is about to happen.
Let’s decode it:
Together, 18 09 15 is my daily reminder: You are the lead character in your own entertainment.
You can add any other libraries (e.g.: SDL2_gfx, freetype, gettext, gmp...) using commands like:
mkdir cross-android/ && cd cross-android/
../configure --host=arm-linux-androideabi --prefix=$NDK_STANDALONE/sysroot/usr \
--with-some-option --enable-another-option \
--disable-shared
make -j$(nproc)
make installStatic builds (--disable-shared) are recommended for simplicity (no additional .so to declare).
(FIXME: is there an SDL3_gfx?)
Example with SDL2_gfx:
VERSION=1.0.3
wget http://www.ferzkopp.net/Software/SDL2_gfx/SDL2_gfx-$VERSION.tar.gz
tar xf SDL2_gfx-$VERSION.tar.gz
mv SDL2_gfx-$VERSION/ SDL2_gfx/
cd SDL2_gfx/
mkdir cross-android/ && cd cross-android/
../configure --host=arm-linux-androideabi --prefix=$NDK_STANDALONE/sysroot/usr \
--disable-shared --disable-mmx
make -j$(nproc)
make installYou can compile YOUR application using this technique, with some more steps to tell Android how to run it using JNI.
First, prepare an Android project:
/usr/src/SDL3/android-project skeleton as explained in README-android.md. You can leave it as-is in a first step.mkdir -p libs/armeabi/
for i in /usr/src/SDL3/build/org.libsdl/libs/armeabi/*; do ln -nfs $i libs/armeabi/; doneMake your project Android-aware:
/usr/src/SDL3/src/main/android/SDL_android_main.c in your project (comment out the line referencing "SDL_internal.h"). Compile it as C (not C++).configure.ac, detect Android:AM_CONDITIONAL(ANDROID, test "$host" = "arm-unknown-linux-androideabi")Makefile.am, tell Automake you'll build executables as libraries, using something like:if ANDROID
<!-- Build .so JNI libs rather than executables -->
AM_CFLAGS = -fPIC
AM_LDFLAGS += -shared
COMMON_OBJS += SDL_android_main.c
endifPATH=$NDK_STANDALONE/bin:$PATH
mkdir cross-android/ && cd cross-android/
../configure --host=arm-linux-androideabi \
--prefix=/android-aint-posix \
--with-your-option --enable-your-other-option ...
makearmeabi-v7a and document what devices support it); something like:mkdir cross-android-v7a/ && cd cross-android-v7a/
# .o: -march=armv5te -mtune=xscale -msoft-float -mthumb => -march=armv7-a -mfpu=vfpv3-d16 -mfloat-abi=softfp -mthumb
# .so: -march=armv7-a -Wl,--fix-cortex-a8
CFLAGS="-g -O2 -march=armv7-a -mfpu=vfpv3-d16 -mfloat-abi=softfp -mthumb" LFDLAGS="-march=armv7-a -Wl,--fix-cortex-a8" \
../configure --host=arm-linux-androideabi \
...Now you can install your pre-built binaries and build the Android project:
android-project/libs/armeabi/libmain.so..apk:android update project --name your_app --path . --target android-XX
ant debug
ant installdadb shell am start -a android.intenon.MAIN -n org.libsdl.app/org.libsdl.app.SDLActivity # replace with your app package(Work In Progress)
You can use our Android GCC toolchain using a simple toolchain file:
# CMake toolchain file
SET(CMAKE_SYSTEM_NAME Linux) # Tell CMake we're cross-compiling
include(CMakeForceCompiler)
# Prefix detection only works with compiler id "GNU"
CMAKE_FORCE_C_COMPILER(arm-linux-androideabi-gcc GNU)
SET(ANDROID TRUE)You then call CMake like this:
PATH=$NDK_STANDALONE/bin:$PATH
cmake \
-D CMAKE_TOOLCHAIN_FILE=../android_toolchain.cmake \
...If ant installd categorically refuses to install with Failure [INSTALL_FAILED_INSUFFICIENT_STORAGE], even if you have free local storage, that may mean anything. Check logcat first:
adb logcatIf the error logs are not helpful (likely ;')) try locating all past traces of the application:
find / -name "org...."and remove them all.
If the problem persists, you may try installing on the SD card:
adb install -s bin/app-debug.apkIf you get in your logcat:
SDL: Couldn't locate Java callbacks, check that they're named and typed correctly
this probably means your SDLActivity.java is out-of-sync with your libSDL3.so.