|
@@ -4,7 +4,8 @@ Android
|
|
Matt Styles wrote a tutorial on building SDL for Android with Visual Studio:
|
|
Matt Styles wrote a tutorial on building SDL for Android with Visual Studio:
|
|
http://trederia.blogspot.de/2017/03/building-sdl2-for-android-with-visual.html
|
|
http://trederia.blogspot.de/2017/03/building-sdl2-for-android-with-visual.html
|
|
|
|
|
|
-The rest of this README covers the old style build process.
|
|
|
|
|
|
+The rest of this README covers the traditional style build process.
|
|
|
|
+
|
|
|
|
|
|
================================================================================
|
|
================================================================================
|
|
Requirements
|
|
Requirements
|
|
@@ -19,6 +20,7 @@ https://developer.android.com/tools/sdk/ndk/index.html
|
|
Minimum API level supported by SDL: 10 (Android 2.3.3)
|
|
Minimum API level supported by SDL: 10 (Android 2.3.3)
|
|
Joystick support is available for API level >= 12 devices.
|
|
Joystick support is available for API level >= 12 devices.
|
|
|
|
|
|
|
|
+
|
|
================================================================================
|
|
================================================================================
|
|
How the port works
|
|
How the port works
|
|
================================================================================
|
|
================================================================================
|
|
@@ -31,15 +33,12 @@ Joystick support is available for API level >= 12 devices.
|
|
- This eventually produces a standard Android .apk package
|
|
- This eventually produces a standard Android .apk package
|
|
|
|
|
|
The Android Java code implements an "Activity" and can be found in:
|
|
The Android Java code implements an "Activity" and can be found in:
|
|
-android-project/src/org/libsdl/app/SDLActivity.java
|
|
|
|
|
|
+android-project/app/src/main/java/org/libsdl/app/SDLActivity.java
|
|
|
|
|
|
The Java code loads your game code, the SDL shared library, and
|
|
The Java code loads your game code, the SDL shared library, and
|
|
dispatches to native functions implemented in the SDL library:
|
|
dispatches to native functions implemented in the SDL library:
|
|
src/core/android/SDL_android.c
|
|
src/core/android/SDL_android.c
|
|
|
|
|
|
-Your project must include some glue code that starts your main() routine:
|
|
|
|
-src/main/android/SDL_android_main.c
|
|
|
|
-
|
|
|
|
|
|
|
|
================================================================================
|
|
================================================================================
|
|
Building an app
|
|
Building an app
|
|
@@ -74,71 +73,32 @@ For more complex projects, follow these instructions:
|
|
|
|
|
|
1. Copy the android-project directory wherever you want to keep your projects
|
|
1. Copy the android-project directory wherever you want to keep your projects
|
|
and rename it to the name of your project.
|
|
and rename it to the name of your project.
|
|
-2. Move or symlink this SDL directory into the "<project>/jni" directory
|
|
|
|
-3. Edit "<project>/jni/src/Android.mk" to include your source files
|
|
|
|
|
|
+2. Move or symlink this SDL directory into the "<project>/app/jni" directory
|
|
|
|
+3. Edit "<project>/app/jni/src/Android.mk" to include your source files
|
|
4. Run 'ndk-build' (a script provided by the NDK). This compiles the C source
|
|
4. Run 'ndk-build' (a script provided by the NDK). This compiles the C source
|
|
|
|
|
|
-If you want to use the Eclipse IDE, skip to the Eclipse section below.
|
|
|
|
-
|
|
|
|
-5. Create "<project>/local.properties" and use that to point to the Android SDK directory, by writing a line with the following form:
|
|
|
|
|
|
+If you want to use Android Studio (recommended), skip to the Android Studio section below.
|
|
|
|
|
|
- sdk.dir=PATH_TO_ANDROID_SDK
|
|
|
|
-
|
|
|
|
-6. Run 'ant debug' in android/project. This compiles the .java and eventually
|
|
|
|
- creates a .apk with the native code embedded
|
|
|
|
-7. 'ant debug install' will push the apk to the device or emulator (if connected)
|
|
|
|
|
|
+5. Run './gradlew installDebug' in the project directory. This compiles the .java, creates an .apk with the native code embedded, and installs it on any connected Android device
|
|
|
|
|
|
Here's an explanation of the files in the Android project, so you can customize them:
|
|
Here's an explanation of the files in the Android project, so you can customize them:
|
|
|
|
|
|
- android-project/
|
|
|
|
- AndroidManifest.xml - package manifest. Among others, it contains the class name
|
|
|
|
|
|
+ android-project/app
|
|
|
|
+ build.gradle - build info including the application version and SDK
|
|
|
|
+ src/main/AndroidManifest.xml - package manifest. Among others, it contains the class name
|
|
of the main Activity and the package name of the application.
|
|
of the main Activity and the package name of the application.
|
|
- build.properties - empty
|
|
|
|
- build.xml - build description file, used by ant. The actual application name
|
|
|
|
- is specified here.
|
|
|
|
- default.properties - holds the target ABI for the application, android-10 and up
|
|
|
|
- project.properties - holds the target ABI for the application, android-10 and up
|
|
|
|
- local.properties - holds the SDK path, you should change this to the path to your SDK
|
|
|
|
jni/ - directory holding native code
|
|
jni/ - directory holding native code
|
|
- jni/Android.mk - Android makefile that can call recursively the Android.mk files
|
|
|
|
- in all subdirectories
|
|
|
|
|
|
+ jni/Application.mk - Application JNI settings, including target platform and STL library
|
|
|
|
+ jni/Android.mk - Android makefile that can call recursively the Android.mk files in all subdirectories
|
|
jni/SDL/ - (symlink to) directory holding the SDL library files
|
|
jni/SDL/ - (symlink to) directory holding the SDL library files
|
|
jni/SDL/Android.mk - Android makefile for creating the SDL shared library
|
|
jni/SDL/Android.mk - Android makefile for creating the SDL shared library
|
|
jni/src/ - directory holding your C/C++ source
|
|
jni/src/ - directory holding your C/C++ source
|
|
- jni/src/Android.mk - Android makefile that you should customize to include your
|
|
|
|
- source code and any library references
|
|
|
|
- res/ - directory holding resources for your application
|
|
|
|
- res/drawable-* - directories holding icons for different phone hardware. Could be
|
|
|
|
- one dir called "drawable".
|
|
|
|
- res/layout/main.xml - Usually contains a file main.xml, which declares the screen layout.
|
|
|
|
- We don't need it because we use the SDL video output.
|
|
|
|
- res/values/strings.xml - strings used in your application, including the application name
|
|
|
|
- shown on the phone.
|
|
|
|
- src/org/libsdl/app/SDLActivity.java - the Java class handling the initialization and binding
|
|
|
|
- to SDL. Be very careful changing this, as the SDL library relies
|
|
|
|
- on this implementation.
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-================================================================================
|
|
|
|
- Build an app with static linking of libSDL
|
|
|
|
-================================================================================
|
|
|
|
-
|
|
|
|
-This build uses the Android NDK module system.
|
|
|
|
-
|
|
|
|
-Instructions:
|
|
|
|
-1. Copy the android-project directory wherever you want to keep your projects
|
|
|
|
- and rename it to the name of your project.
|
|
|
|
-2. Rename "<project>/jni/src/Android_static.mk" to "<project>/jni/src/Android.mk"
|
|
|
|
- (overwrite the existing one)
|
|
|
|
-3. Edit "<project>/jni/src/Android.mk" to include your source files
|
|
|
|
-4. create and export an environment variable named NDK_MODULE_PATH that points
|
|
|
|
- to the parent directory of this SDL directory. e.g.:
|
|
|
|
-
|
|
|
|
- export NDK_MODULE_PATH="$PWD"/..
|
|
|
|
-
|
|
|
|
-5. Edit "<project>/src/org/libsdl/app/SDLActivity.java" and remove the call to
|
|
|
|
- System.loadLibrary("SDL2").
|
|
|
|
-6. Run 'ndk-build' (a script provided by the NDK). This compiles the C source
|
|
|
|
|
|
+ jni/src/Android.mk - Android makefile that you should customize to include your source code and any library references
|
|
|
|
+ src/main/assets/ - directory holding asset files for your application
|
|
|
|
+ src/main/res/ - directory holding resources for your application
|
|
|
|
+ src/main/res/mipmap-* - directories holding icons for different phone hardware
|
|
|
|
+ src/main/res/values/strings.xml - strings used in your application, including the application name
|
|
|
|
+ src/main/java/org/libsdl/app/SDLActivity.java - the Java class handling the initialization and binding to SDL. Be very careful changing this, as the SDL library relies on this implementation. You should instead subclass this for your application.
|
|
|
|
|
|
|
|
|
|
================================================================================
|
|
================================================================================
|
|
@@ -171,25 +131,23 @@ Here's an example of a minimal class file:
|
|
Then replace "SDLActivity" in AndroidManifest.xml with the name of your
|
|
Then replace "SDLActivity" in AndroidManifest.xml with the name of your
|
|
class, .e.g. "MyGame"
|
|
class, .e.g. "MyGame"
|
|
|
|
|
|
|
|
+
|
|
================================================================================
|
|
================================================================================
|
|
Customizing your application icon
|
|
Customizing your application icon
|
|
================================================================================
|
|
================================================================================
|
|
|
|
|
|
Conceptually changing your icon is just replacing the "ic_launcher.png" files in
|
|
Conceptually changing your icon is just replacing the "ic_launcher.png" files in
|
|
-the drawable directories under the res directory. There are four directories for
|
|
|
|
-different screen sizes. These can be replaced with one dir called "drawable",
|
|
|
|
-containing an icon file "ic_launcher.png" with dimensions 48x48 or 72x72.
|
|
|
|
|
|
+the drawable directories under the res directory. There are several directories
|
|
|
|
+for different screen sizes.
|
|
|
|
|
|
-You may need to change the name of your icon in AndroidManifest.xml to match
|
|
|
|
-this icon filename.
|
|
|
|
|
|
|
|
================================================================================
|
|
================================================================================
|
|
Loading assets
|
|
Loading assets
|
|
================================================================================
|
|
================================================================================
|
|
|
|
|
|
-Any files you put in the "assets" directory of your android-project directory
|
|
|
|
-will get bundled into the application package and you can load them using the
|
|
|
|
-standard functions in SDL_rwops.h.
|
|
|
|
|
|
+Any files you put in the "app/src/main/assets" directory of your project
|
|
|
|
+directory will get bundled into the application package and you can load
|
|
|
|
+them using the standard functions in SDL_rwops.h.
|
|
|
|
|
|
There are also a few Android specific functions that allow you to get other
|
|
There are also a few Android specific functions that allow you to get other
|
|
useful paths for saving and loading data:
|
|
useful paths for saving and loading data:
|
|
@@ -211,6 +169,7 @@ disable this behaviour, see for example:
|
|
|
|
|
|
http://ponystyle.com/blog/2010/03/26/dealing-with-asset-compression-in-android-apps/
|
|
http://ponystyle.com/blog/2010/03/26/dealing-with-asset-compression-in-android-apps/
|
|
|
|
|
|
|
|
+
|
|
================================================================================
|
|
================================================================================
|
|
Pause / Resume behaviour
|
|
Pause / Resume behaviour
|
|
================================================================================
|
|
================================================================================
|
|
@@ -231,6 +190,7 @@ a specific message, (which is not yet implemented!) and restore your textures
|
|
manually or quit the app (which is actually the kind of behaviour you'll see
|
|
manually or quit the app (which is actually the kind of behaviour you'll see
|
|
under iOS, if the OS can not restore your GL context it will just kill your app)
|
|
under iOS, if the OS can not restore your GL context it will just kill your app)
|
|
|
|
|
|
|
|
+
|
|
================================================================================
|
|
================================================================================
|
|
Threads and the Java VM
|
|
Threads and the Java VM
|
|
================================================================================
|
|
================================================================================
|
|
@@ -246,6 +206,7 @@ Android_JNI_SetupThread() before doing anything else otherwise SDL will attach
|
|
your thread automatically anyway (when you make an SDL call), but it'll never
|
|
your thread automatically anyway (when you make an SDL call), but it'll never
|
|
detach it.
|
|
detach it.
|
|
|
|
|
|
|
|
+
|
|
================================================================================
|
|
================================================================================
|
|
Using STL
|
|
Using STL
|
|
================================================================================
|
|
================================================================================
|
|
@@ -257,6 +218,7 @@ folder and adding the following line:
|
|
|
|
|
|
For more information check out CPLUSPLUS-SUPPORT.html in the NDK documentation.
|
|
For more information check out CPLUSPLUS-SUPPORT.html in the NDK documentation.
|
|
|
|
|
|
|
|
+
|
|
================================================================================
|
|
================================================================================
|
|
Additional documentation
|
|
Additional documentation
|
|
================================================================================
|
|
================================================================================
|
|
@@ -268,19 +230,10 @@ The best place to start is with docs/OVERVIEW.TXT
|
|
|
|
|
|
|
|
|
|
================================================================================
|
|
================================================================================
|
|
- Using Eclipse
|
|
|
|
|
|
+ Using Android Studio
|
|
================================================================================
|
|
================================================================================
|
|
|
|
|
|
-First make sure that you've installed Eclipse and the Android extensions as described here:
|
|
|
|
- https://developer.android.com/tools/sdk/eclipse-adt.html
|
|
|
|
-
|
|
|
|
-Once you've copied the SDL android project and customized it, you can create an Eclipse project from it:
|
|
|
|
- * File -> New -> Other
|
|
|
|
- * Select the Android -> Android Project wizard and click Next
|
|
|
|
- * Enter the name you'd like your project to have
|
|
|
|
- * Select "Create project from existing source" and browse for your project directory
|
|
|
|
- * Make sure the Build Target is set to Android 3.1 (API 12)
|
|
|
|
- * Click Finish
|
|
|
|
|
|
+You can open your project directory with Android Studio and run it normally.
|
|
|
|
|
|
|
|
|
|
================================================================================
|
|
================================================================================
|
|
@@ -295,13 +248,11 @@ Especially useful is the info on setting up OpenGL ES 2.0 emulation.
|
|
Notice that this software emulator is incredibly slow and needs a lot of disk space.
|
|
Notice that this software emulator is incredibly slow and needs a lot of disk space.
|
|
Using a real device works better.
|
|
Using a real device works better.
|
|
|
|
|
|
|
|
+
|
|
================================================================================
|
|
================================================================================
|
|
Troubleshooting
|
|
Troubleshooting
|
|
================================================================================
|
|
================================================================================
|
|
|
|
|
|
-You can create and run an emulator from the Eclipse IDE:
|
|
|
|
- * Window -> Android SDK and AVD Manager
|
|
|
|
-
|
|
|
|
You can see if adb can see any devices with the following command:
|
|
You can see if adb can see any devices with the following command:
|
|
|
|
|
|
adb devices
|
|
adb devices
|
|
@@ -426,19 +377,21 @@ When you're done instrumenting with valgrind, you can disable the wrapper:
|
|
|
|
|
|
adb shell setprop wrap.org.libsdl.app ""
|
|
adb shell setprop wrap.org.libsdl.app ""
|
|
|
|
|
|
|
|
+
|
|
================================================================================
|
|
================================================================================
|
|
Graphics debugging
|
|
Graphics debugging
|
|
================================================================================
|
|
================================================================================
|
|
|
|
|
|
If you are developing on a compatible Tegra-based tablet, NVidia provides
|
|
If you are developing on a compatible Tegra-based tablet, NVidia provides
|
|
-Tegra Graphics Debugger at their website. Because SDL2 dynamically loads EGL
|
|
|
|
|
|
+Tegra Graphics Debugger at their website. Because SDL2 dynamically loads EGL
|
|
and GLES libraries, you must follow their instructions for installing the
|
|
and GLES libraries, you must follow their instructions for installing the
|
|
-interposer library on a rooted device. The non-rooted instructions are not
|
|
|
|
|
|
+interposer library on a rooted device. The non-rooted instructions are not
|
|
compatible with applications that use SDL2 for video.
|
|
compatible with applications that use SDL2 for video.
|
|
|
|
|
|
The Tegra Graphics Debugger is available from NVidia here:
|
|
The Tegra Graphics Debugger is available from NVidia here:
|
|
https://developer.nvidia.com/tegra-graphics-debugger
|
|
https://developer.nvidia.com/tegra-graphics-debugger
|
|
|
|
|
|
|
|
+
|
|
================================================================================
|
|
================================================================================
|
|
Why is API level 10 the minimum required?
|
|
Why is API level 10 the minimum required?
|
|
================================================================================
|
|
================================================================================
|
|
@@ -446,7 +399,7 @@ https://developer.nvidia.com/tegra-graphics-debugger
|
|
API level 10 is the minimum required level at runtime (that is, on the device)
|
|
API level 10 is the minimum required level at runtime (that is, on the device)
|
|
because SDL requires some functionality for running not
|
|
because SDL requires some functionality for running not
|
|
available on older devices. Since the incorporation of joystick support into SDL,
|
|
available on older devices. Since the incorporation of joystick support into SDL,
|
|
-the minimum SDK required to *build* SDL is version 12. Devices running API levels
|
|
|
|
|
|
+the minimum SDK required to *build* SDL is version 16. Devices running API levels
|
|
10-11 are still supported, only with the joystick functionality disabled.
|
|
10-11 are still supported, only with the joystick functionality disabled.
|
|
|
|
|
|
Support for native OpenGL ES and ES2 applications was introduced in the NDK for
|
|
Support for native OpenGL ES and ES2 applications was introduced in the NDK for
|
|
@@ -457,6 +410,7 @@ As of this writing, according to https://developer.android.com/about/dashboards/
|
|
about 90% of the Android devices accessing Google Play support API level 10 or
|
|
about 90% of the Android devices accessing Google Play support API level 10 or
|
|
higher (March 2013).
|
|
higher (March 2013).
|
|
|
|
|
|
|
|
+
|
|
================================================================================
|
|
================================================================================
|
|
A note regarding the use of the "dirty rectangles" rendering technique
|
|
A note regarding the use of the "dirty rectangles" rendering technique
|
|
================================================================================
|
|
================================================================================
|
|
@@ -475,6 +429,7 @@ screen each frame.
|
|
|
|
|
|
Reference: http://www.khronos.org/registry/egl/specs/EGLTechNote0001.html
|
|
Reference: http://www.khronos.org/registry/egl/specs/EGLTechNote0001.html
|
|
|
|
|
|
|
|
+
|
|
================================================================================
|
|
================================================================================
|
|
Known issues
|
|
Known issues
|
|
================================================================================
|
|
================================================================================
|