This repository has been archived by the owner. It is now read-only.
Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Cleanups.
- Moved to 'project' instead of 'testproject' - Removed extraneous .c files - Removed the android_libs folder (that was against the NDK agreement anyway)
- Loading branch information
Showing
with
1,363 additions
and 4 deletions.
- +2 −2 README.android
- +15 −0 android/project/AndroidManifest.xml
- +17 −0 android/project/build.properties
- +67 −0 android/project/build.xml
- +11 −0 android/project/default.properties
- +18 −0 android/project/jni/Android.mk
- +242 −0 android/project/jni/android-support.cpp
- +574 −0 android/project/jni/lesson05.c
- +10 −0 android/project/local.properties
- BIN android/project/res/drawable-hdpi/icon.png
- BIN android/project/res/drawable-ldpi/icon.png
- BIN android/project/res/drawable-mdpi/icon.png
- +13 −0 android/project/res/layout/main.xml
- +4 −0 android/project/res/values/strings.xml
- +388 −0 android/project/src/org/libsdl/app/SDLActivity.java
- +2 −2 android/testproject/jni/app-android.cpp
- BIN build-scripts/android_libs/libEGL.so
- BIN build-scripts/android_libs/libcutils.so
- BIN build-scripts/android_libs/libutils.so
@@ -0,0 +1,15 @@ | ||
<?xml version="1.0" encoding="utf-8"?> | ||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" | ||
package="org.libsdl.app" | ||
android:versionCode="1" | ||
android:versionName="1.0"> | ||
<application android:label="@string/app_name" android:icon="@drawable/icon"> | ||
<activity android:name="SDLActivity" | ||
android:label="@string/app_name"> | ||
<intent-filter> | ||
<action android:name="android.intent.action.MAIN" /> | ||
<category android:name="android.intent.category.LAUNCHER" /> | ||
</intent-filter> | ||
</activity> | ||
</application> | ||
</manifest> |
@@ -0,0 +1,17 @@ | ||
# This file is used to override default values used by the Ant build system. | ||
# | ||
# This file must be checked in Version Control Systems, as it is | ||
# integral to the build system of your project. | ||
|
||
# This file is only used by the Ant script. | ||
|
||
# You can use this to override default values such as | ||
# 'source.dir' for the location of your java source folder and | ||
# 'out.dir' for the location of your output folder. | ||
|
||
# You can also use it define how the release builds are signed by declaring | ||
# the following properties: | ||
# 'key.store' for the location of your keystore and | ||
# 'key.alias' for the name of the key to use. | ||
# The password will be asked during the build when you use the 'release' target. | ||
|
@@ -0,0 +1,67 @@ | ||
<?xml version="1.0" encoding="UTF-8"?> | ||
<project name="SDLApp" default="help"> | ||
|
||
<!-- The local.properties file is created and updated by the 'android' tool. | ||
It contains the path to the SDK. It should *NOT* be checked in in Version | ||
Control Systems. --> | ||
<property file="local.properties" /> | ||
|
||
<!-- The build.properties file can be created by you and is never touched | ||
by the 'android' tool. This is the place to change some of the default property values | ||
used by the Ant rules. | ||
Here are some properties you may want to change/update: | ||
application.package | ||
the name of your application package as defined in the manifest. Used by the | ||
'uninstall' rule. | ||
source.dir | ||
the name of the source directory. Default is 'src'. | ||
out.dir | ||
the name of the output directory. Default is 'bin'. | ||
Properties related to the SDK location or the project target should be updated | ||
using the 'android' tool with the 'update' action. | ||
This file is an integral part of the build system for your application and | ||
should be checked in in Version Control Systems. | ||
--> | ||
<property file="build.properties" /> | ||
|
||
<!-- The default.properties file is created and updated by the 'android' tool, as well | ||
as ADT. | ||
This file is an integral part of the build system for your application and | ||
should be checked in in Version Control Systems. --> | ||
<property file="default.properties" /> | ||
|
||
<!-- Custom Android task to deal with the project target, and import the proper rules. | ||
This requires ant 1.6.0 or above. --> | ||
<path id="android.antlibs"> | ||
<pathelement path="${sdk.dir}/tools/lib/anttasks.jar" /> | ||
<pathelement path="${sdk.dir}/tools/lib/sdklib.jar" /> | ||
<pathelement path="${sdk.dir}/tools/lib/androidprefs.jar" /> | ||
<pathelement path="${sdk.dir}/tools/lib/apkbuilder.jar" /> | ||
<pathelement path="${sdk.dir}/tools/lib/jarutils.jar" /> | ||
</path> | ||
|
||
<taskdef name="setup" | ||
classname="com.android.ant.SetupTask" | ||
classpathref="android.antlibs" /> | ||
|
||
<!-- Execute the Android Setup task that will setup some properties specific to the target, | ||
and import the build rules files. | ||
The rules file is imported from | ||
<SDK>/platforms/<target_platform>/templates/android_rules.xml | ||
To customize some build steps for your project: | ||
- copy the content of the main node <project> from android_rules.xml | ||
- paste it in this build.xml below the <setup /> task. | ||
- disable the import by changing the setup task below to <setup import="false" /> | ||
This will ensure that the properties are setup correctly but that your customized | ||
build steps are used. | ||
--> | ||
<setup /> | ||
|
||
</project> |
@@ -0,0 +1,11 @@ | ||
# This file is automatically generated by Android Tools. | ||
# Do not modify this file -- YOUR CHANGES WILL BE ERASED! | ||
# | ||
# This file must be checked in Version Control Systems. | ||
# | ||
# To customize properties used by the Ant build system use, | ||
# "build.properties", and override values to adapt the script to your | ||
# project structure. | ||
|
||
# Project target. | ||
target=android-7 |
@@ -0,0 +1,18 @@ | ||
LOCAL_PATH := $(call my-dir) | ||
|
||
include $(CLEAR_VARS) | ||
|
||
LOCAL_MODULE := sdlapp | ||
SDL := ../../../ | ||
|
||
LOCAL_CFLAGS := -DANDROID_NDK \ | ||
-DDISABLE_IMPORTGL \ | ||
-I$(SDL)/include | ||
|
||
LOCAL_SRC_FILES := \ | ||
android-support.cpp \ | ||
lesson05.c \ | ||
|
||
LOCAL_LDLIBS := -lGLESv1_CM -ldl -llog -lSDL -lgcc -L$(SDL) | ||
|
||
include $(BUILD_SHARED_LIBRARY) |
@@ -0,0 +1,242 @@ | ||
/******************************************************************************* | ||
This file links the Java side of Android with libsdl | ||
*******************************************************************************/ | ||
#include <jni.h> | ||
#include <sys/time.h> | ||
#include <time.h> | ||
#include <android/log.h> | ||
#include <stdint.h> | ||
#include <stdio.h> | ||
#include <stdlib.h> | ||
#include <math.h> | ||
#include <pthread.h> | ||
|
||
#define DEBUG | ||
|
||
|
||
/******************************************************************************* | ||
Globals | ||
*******************************************************************************/ | ||
static long _getTime(void){ | ||
struct timeval now; | ||
gettimeofday(&now, NULL); | ||
return (long)(now.tv_sec*1000 + now.tv_usec/1000); | ||
} | ||
|
||
JNIEnv* mEnv = NULL; | ||
JNIEnv* mAudioThreadEnv = NULL; //See the note below for why this is necessary | ||
JavaVM* mVM = NULL; | ||
|
||
//Main activity | ||
jclass mActivityInstance; | ||
|
||
//method signatures | ||
jmethodID midCreateGLContext; | ||
jmethodID midFlipBuffers; | ||
jmethodID midEnableFeature; | ||
jmethodID midUpdateAudio; | ||
|
||
extern "C" int SDL_main(); | ||
extern "C" int Android_OnKeyDown(int keycode); | ||
extern "C" int Android_OnKeyUp(int keycode); | ||
extern "C" void Android_SetScreenResolution(int width, int height); | ||
extern "C" void Android_OnResize(int width, int height, int format); | ||
extern "C" int SDL_SendQuit(); | ||
extern "C" void Android_EnableFeature(int featureid, bool enabled); | ||
|
||
//If we're not the active app, don't try to render | ||
bool bRenderingEnabled = false; | ||
|
||
//Feature IDs | ||
static const int FEATURE_AUDIO = 1; | ||
static const int FEATURE_ACCEL = 2; | ||
|
||
//Accelerometer data storage | ||
float fLastAccelerometer[3]; | ||
|
||
|
||
/******************************************************************************* | ||
Functions called by JNI | ||
*******************************************************************************/ | ||
|
||
//Library init | ||
extern "C" jint JNI_OnLoad(JavaVM* vm, void* reserved){ | ||
|
||
JNIEnv* env = NULL; | ||
jint result = -1; | ||
|
||
if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) { | ||
return result; | ||
} | ||
|
||
mEnv = env; | ||
|
||
__android_log_print(ANDROID_LOG_INFO, "SDL", "JNI: OnLoad"); | ||
|
||
jclass cls = mEnv->FindClass ("org/libsdl/app/SDLActivity"); | ||
mActivityInstance = cls; | ||
midCreateGLContext = mEnv->GetStaticMethodID(cls,"createGLContext","()V"); | ||
midFlipBuffers = mEnv->GetStaticMethodID(cls,"flipBuffers","()V"); | ||
midEnableFeature = mEnv->GetStaticMethodID(cls,"enableFeature","(II)V"); | ||
midUpdateAudio = mEnv->GetStaticMethodID(cls,"updateAudio","([B)V"); | ||
|
||
if(!midCreateGLContext || !midFlipBuffers || !midEnableFeature || | ||
!midUpdateAudio){ | ||
__android_log_print(ANDROID_LOG_INFO, "SDL", "SDL: Bad mids\n"); | ||
}else{ | ||
#ifdef DEBUG | ||
__android_log_print(ANDROID_LOG_INFO, "SDL", "SDL: Good mids\n"); | ||
#endif | ||
} | ||
|
||
return JNI_VERSION_1_4; | ||
} | ||
|
||
//Start up the SDL app | ||
extern "C" void Java_org_libsdl_app_SDLActivity_nativeInit( JNIEnv* env, | ||
jobject obj ){ | ||
|
||
__android_log_print(ANDROID_LOG_INFO, "SDL", "SDL: Native Init"); | ||
|
||
mEnv = env; | ||
bRenderingEnabled = true; | ||
|
||
Android_EnableFeature(FEATURE_ACCEL, true); | ||
|
||
SDL_main(); | ||
} | ||
|
||
//Keydown | ||
extern "C" void Java_org_libsdl_app_SDLActivity_onNativeKeyDown(JNIEnv* env, | ||
jobject obj, jint keycode){ | ||
|
||
int r = Android_OnKeyDown(keycode); | ||
#ifdef DEBUG | ||
__android_log_print(ANDROID_LOG_INFO, "SDL", | ||
"SDL: native key down %d, %d\n", keycode, r); | ||
#endif | ||
|
||
} | ||
|
||
//Keyup | ||
extern "C" void Java_org_libsdl_app_SDLActivity_onNativeKeyUp(JNIEnv* env, | ||
jobject obj, jint keycode){ | ||
|
||
int r = Android_OnKeyUp(keycode); | ||
#ifdef DEBUG | ||
__android_log_print(ANDROID_LOG_INFO, "SDL", | ||
"SDL: native key up %d, %d\n", keycode, r); | ||
#endif | ||
|
||
} | ||
|
||
//Touch | ||
extern "C" void Java_org_libsdl_app_SDLActivity_onNativeTouch(JNIEnv* env, | ||
jobject obj, jint action, jfloat x, jfloat y, jfloat p){ | ||
|
||
#ifdef DEBUG | ||
__android_log_print(ANDROID_LOG_INFO, "SDL", | ||
"SDL: native touch event %d @ %f/%f, pressure %f\n", | ||
action, x, y, p); | ||
#endif | ||
|
||
//TODO: Pass this off to the SDL multitouch stuff | ||
|
||
} | ||
|
||
//Quit | ||
extern "C" void Java_org_libsdl_app_SDLActivity_nativeQuit( JNIEnv* env, | ||
jobject obj ){ | ||
|
||
//Stop rendering as we're no longer in the foreground | ||
bRenderingEnabled = false; | ||
|
||
//Inject a SDL_QUIT event | ||
int r = SDL_SendQuit(); | ||
|
||
__android_log_print(ANDROID_LOG_INFO, "SDL", "SDL: Native quit %d", r); | ||
} | ||
|
||
//Screen size | ||
extern "C" void Java_org_libsdl_app_SDLActivity_nativeSetScreenSize( | ||
JNIEnv* env, jobject obj, jint width, jint height){ | ||
|
||
__android_log_print(ANDROID_LOG_INFO, "SDL", | ||
"SDL: Set screen size on init: %d/%d\n", width, height); | ||
Android_SetScreenResolution(width, height); | ||
|
||
} | ||
|
||
//Resize | ||
extern "C" void Java_org_libsdl_app_SDLActivity_onNativeResize( | ||
JNIEnv* env, jobject obj, jint width, | ||
jint height, jint format){ | ||
Android_OnResize(width, height, format); | ||
} | ||
|
||
extern "C" void Java_org_libsdl_app_SDLActivity_onNativeAccel( | ||
JNIEnv* env, jobject obj, | ||
jfloat x, jfloat y, jfloat z){ | ||
fLastAccelerometer[0] = x; | ||
fLastAccelerometer[1] = y; | ||
fLastAccelerometer[2] = z; | ||
} | ||
|
||
|
||
|
||
/******************************************************************************* | ||
Functions called by SDL into Java | ||
*******************************************************************************/ | ||
extern "C" void Android_CreateContext(){ | ||
__android_log_print(ANDROID_LOG_INFO, "SDL", "SDL: sdl_create_context()\n"); | ||
|
||
bRenderingEnabled = true; | ||
|
||
mEnv->CallStaticVoidMethod(mActivityInstance, midCreateGLContext ); | ||
} | ||
|
||
extern "C" void Android_Render(){ | ||
|
||
if(!bRenderingEnabled){ | ||
return; | ||
} | ||
|
||
//When we get here, we've accumulated a full frame | ||
mEnv->CallStaticVoidMethod(mActivityInstance, midFlipBuffers ); | ||
} | ||
|
||
extern "C" void Android_EnableFeature(int featureid, bool enabled){ | ||
|
||
mEnv->CallStaticVoidMethod(mActivityInstance, midEnableFeature, | ||
featureid, (int)enabled); | ||
} | ||
|
||
extern "C" void Android_UpdateAudioBuffer(unsigned char *buf, int len){ | ||
|
||
//Annoyingly we can't just call into Java from any thread. Because the audio | ||
//callback is dispatched from the SDL audio thread (that wasn't made from | ||
//java, we have to do some magic here to let the JVM know about the thread. | ||
//Because everything it touches on the Java side is static anyway, it's | ||
//not a big deal, just annoying. | ||
if(!mAudioThreadEnv){ | ||
__android_log_print(ANDROID_LOG_INFO, "SDL", "SDL: Need to set up audio thread env\n"); | ||
|
||
mVM->AttachCurrentThread(&mAudioThreadEnv, NULL); | ||
|
||
__android_log_print(ANDROID_LOG_INFO, "SDL", "SDL: ok\n"); | ||
} | ||
|
||
jbyteArray arr = mAudioThreadEnv->NewByteArray(len); | ||
|
||
//blah. We probably should rework this so we avoid the copy. | ||
mAudioThreadEnv->SetByteArrayRegion(arr, 0, len, (jbyte *)buf); | ||
|
||
__android_log_print(ANDROID_LOG_INFO, "SDL", "SDL: copied\n"); | ||
|
||
mAudioThreadEnv->CallStaticVoidMethod( mActivityInstance, | ||
midUpdateAudio, arr ); | ||
|
||
__android_log_print(ANDROID_LOG_INFO, "SDL", "SDL: invoked\n"); | ||
|
||
} | ||
|
Oops, something went wrong.