Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Latest commit

 

History

History
231 lines (183 loc) · 7.5 KB

SDL_android.cpp

File metadata and controls

231 lines (183 loc) · 7.5 KB
 
Jan 7, 2011
Jan 7, 2011
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/*
SDL - Simple DirectMedia Layer
Copyright (C) 1997-2010 Sam Lantinga
This library 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 library 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 library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Sam Lantinga
slouken@libsdl.org
*/
#include "SDL_config.h"
Aug 17, 2010
Aug 17, 2010
24
25
26
27
28
29
30
31
32
33
/*******************************************************************************
This file links the Java side of Android with libsdl
*******************************************************************************/
#include <jni.h>
#include <android/log.h>
/*******************************************************************************
Globals
*******************************************************************************/
Jan 7, 2011
Jan 7, 2011
34
JavaVM* mVM = NULL;
Aug 17, 2010
Aug 17, 2010
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
JNIEnv* mEnv = NULL;
JNIEnv* mAudioThreadEnv = NULL; //See the note below for why this is necessary
//Main activity
jclass mActivityInstance;
//method signatures
jmethodID midCreateGLContext;
jmethodID midFlipBuffers;
jmethodID midEnableFeature;
jmethodID midUpdateAudio;
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
Jan 7, 2011
Jan 7, 2011
67
*******************************************************************************/
Aug 17, 2010
Aug 17, 2010
68
Jan 7, 2011
Jan 7, 2011
69
70
71
72
// Library init
extern "C" jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
mVM = vm;
Aug 17, 2010
Aug 17, 2010
73
Jan 7, 2011
Jan 7, 2011
74
75
return JNI_VERSION_1_4;
}
Aug 17, 2010
Aug 17, 2010
76
Jan 7, 2011
Jan 7, 2011
77
78
79
// Called before SDL_main() to initialize JNI bindings
extern "C" void SDL_Android_Init(JNIEnv* env)
{
Aug 17, 2010
Aug 17, 2010
80
81
mEnv = env;
Jan 7, 2011
Jan 7, 2011
82
__android_log_print(ANDROID_LOG_INFO, "SDL", "SDL_Android_Init()");
Aug 17, 2010
Aug 17, 2010
83
84
85
86
87
88
89
90
91
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 ||
Jan 7, 2011
Jan 7, 2011
92
!midUpdateAudio) {
Aug 17, 2010
Aug 17, 2010
93
__android_log_print(ANDROID_LOG_INFO, "SDL", "SDL: Bad mids\n");
Jan 7, 2011
Jan 7, 2011
94
} else {
Aug 17, 2010
Aug 17, 2010
95
96
97
98
99
100
#ifdef DEBUG
__android_log_print(ANDROID_LOG_INFO, "SDL", "SDL: Good mids\n");
#endif
}
}
Jan 7, 2011
Jan 7, 2011
101
// Keydown
Aug 17, 2010
Aug 17, 2010
102
extern "C" void Java_org_libsdl_app_SDLActivity_onNativeKeyDown(JNIEnv* env,
Jan 7, 2011
Jan 7, 2011
103
104
jobject obj, jint keycode)
{
Aug 17, 2010
Aug 17, 2010
105
106
107
108
109
110
111
int r = Android_OnKeyDown(keycode);
#ifdef DEBUG
__android_log_print(ANDROID_LOG_INFO, "SDL",
"SDL: native key down %d, %d\n", keycode, r);
#endif
}
Jan 7, 2011
Jan 7, 2011
112
// Keyup
Aug 17, 2010
Aug 17, 2010
113
extern "C" void Java_org_libsdl_app_SDLActivity_onNativeKeyUp(JNIEnv* env,
Jan 7, 2011
Jan 7, 2011
114
115
jobject obj, jint keycode)
{
Aug 17, 2010
Aug 17, 2010
116
117
118
119
120
121
122
int r = Android_OnKeyUp(keycode);
#ifdef DEBUG
__android_log_print(ANDROID_LOG_INFO, "SDL",
"SDL: native key up %d, %d\n", keycode, r);
#endif
}
Jan 7, 2011
Jan 7, 2011
123
// Touch
Aug 17, 2010
Aug 17, 2010
124
extern "C" void Java_org_libsdl_app_SDLActivity_onNativeTouch(JNIEnv* env,
Jan 7, 2011
Jan 7, 2011
125
126
jobject obj, jint action, jfloat x, jfloat y, jfloat p)
{
Aug 17, 2010
Aug 17, 2010
127
128
129
130
131
132
133
134
135
#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
}
Jan 7, 2011
Jan 7, 2011
136
// Quit
Aug 17, 2010
Aug 17, 2010
137
extern "C" void Java_org_libsdl_app_SDLActivity_nativeQuit( JNIEnv* env,
Jan 7, 2011
Jan 7, 2011
138
139
140
141
jobject obj )
{
// Stop rendering as we're no longer in the foreground
bRenderingEnabled = false;
Aug 17, 2010
Aug 17, 2010
142
Jan 7, 2011
Jan 7, 2011
143
144
// Inject a SDL_QUIT event
SDL_SendQuit();
Aug 17, 2010
Aug 17, 2010
145
146
}
Jan 7, 2011
Jan 7, 2011
147
// Screen size
Aug 17, 2010
Aug 17, 2010
148
extern "C" void Java_org_libsdl_app_SDLActivity_nativeSetScreenSize(
Jan 7, 2011
Jan 7, 2011
149
150
JNIEnv* env, jobject obj, jint width, jint height)
{
Aug 17, 2010
Aug 17, 2010
151
152
153
154
155
__android_log_print(ANDROID_LOG_INFO, "SDL",
"SDL: Set screen size on init: %d/%d\n", width, height);
Android_SetScreenResolution(width, height);
}
Jan 7, 2011
Jan 7, 2011
156
// Resize
Aug 17, 2010
Aug 17, 2010
157
158
extern "C" void Java_org_libsdl_app_SDLActivity_onNativeResize(
JNIEnv* env, jobject obj, jint width,
Jan 7, 2011
Jan 7, 2011
159
160
jint height, jint format)
{
Aug 17, 2010
Aug 17, 2010
161
162
163
164
165
Android_OnResize(width, height, format);
}
extern "C" void Java_org_libsdl_app_SDLActivity_onNativeAccel(
JNIEnv* env, jobject obj,
Jan 7, 2011
Jan 7, 2011
166
167
jfloat x, jfloat y, jfloat z)
{
Aug 17, 2010
Aug 17, 2010
168
169
170
171
172
173
174
175
176
177
fLastAccelerometer[0] = x;
fLastAccelerometer[1] = y;
fLastAccelerometer[2] = z;
}
/*******************************************************************************
Functions called by SDL into Java
*******************************************************************************/
Jan 7, 2011
Jan 7, 2011
178
179
180
extern "C" void Android_CreateContext()
{
__android_log_print(ANDROID_LOG_INFO, "SDL", "SDL: sdl_create_context()\n");
Aug 17, 2010
Aug 17, 2010
181
Jan 7, 2011
Jan 7, 2011
182
bRenderingEnabled = true;
Aug 17, 2010
Aug 17, 2010
183
184
185
186
mEnv->CallStaticVoidMethod(mActivityInstance, midCreateGLContext );
}
Jan 7, 2011
Jan 7, 2011
187
188
189
extern "C" void Android_Render()
{
if (!bRenderingEnabled) {
Aug 17, 2010
Aug 17, 2010
190
191
192
return;
}
Jan 7, 2011
Jan 7, 2011
193
194
// When we get here, we've accumulated a full frame
mEnv->CallStaticVoidMethod(mActivityInstance, midFlipBuffers);
Aug 17, 2010
Aug 17, 2010
195
196
}
Jan 7, 2011
Jan 7, 2011
197
198
extern "C" void Android_EnableFeature(int featureid, bool enabled)
{
Aug 17, 2010
Aug 17, 2010
199
200
201
202
mEnv->CallStaticVoidMethod(mActivityInstance, midEnableFeature,
featureid, (int)enabled);
}
Jan 7, 2011
Jan 7, 2011
203
204
extern "C" void Android_UpdateAudioBuffer(unsigned char *buf, int len)
{
Aug 17, 2010
Aug 17, 2010
205
206
207
208
209
//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.
Jan 7, 2011
Jan 7, 2011
210
if(!mAudioThreadEnv) {
Aug 17, 2010
Aug 17, 2010
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
__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");
}