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

Latest commit

 

History

History
241 lines (196 loc) · 8.05 KB

SDL_android.cpp

File metadata and controls

241 lines (196 loc) · 8.05 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"
Jan 13, 2011
Jan 13, 2011
24
25
#include "SDL_android.h"
Jan 12, 2011
Jan 12, 2011
26
27
28
extern "C" {
#include "events/SDL_events_c.h"
#include "video/android/SDL_androidkeyboard.h"
Jan 12, 2011
Jan 12, 2011
29
#include "video/android/SDL_androidvideo.h"
Jan 13, 2011
Jan 13, 2011
30
31
32
33
/* Impelemented in audio/android/SDL_androidaudio.c */
extern void Android_RunAudioThread();
} // C
Jan 12, 2011
Jan 12, 2011
34
Aug 17, 2010
Aug 17, 2010
35
36
37
38
39
40
41
42
43
44
/*******************************************************************************
This file links the Java side of Android with libsdl
*******************************************************************************/
#include <jni.h>
#include <android/log.h>
/*******************************************************************************
Globals
*******************************************************************************/
Jan 13, 2011
Jan 13, 2011
45
46
47
static JavaVM* mVM = NULL;
static JNIEnv* mEnv = NULL;
static JNIEnv* mAudioEnv = NULL;
Aug 17, 2010
Aug 17, 2010
48
Jan 13, 2011
Jan 13, 2011
49
50
// Main activity
static jclass mActivityInstance;
Aug 17, 2010
Aug 17, 2010
51
Jan 13, 2011
Jan 13, 2011
52
53
54
55
56
57
// method signatures
static jmethodID midCreateGLContext;
static jmethodID midFlipBuffers;
static jmethodID midAudioInit;
static jmethodID midAudioWriteShortBuffer;
static jmethodID midAudioWriteByteBuffer;
Jan 13, 2011
Jan 13, 2011
58
static jmethodID midAudioQuit;
Aug 17, 2010
Aug 17, 2010
59
Jan 13, 2011
Jan 13, 2011
60
// Accelerometer data storage
Aug 17, 2010
Aug 17, 2010
61
62
63
64
65
float fLastAccelerometer[3];
/*******************************************************************************
Functions called by JNI
Jan 7, 2011
Jan 7, 2011
66
*******************************************************************************/
Aug 17, 2010
Aug 17, 2010
67
Jan 7, 2011
Jan 7, 2011
68
69
70
71
// Library init
extern "C" jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
mVM = vm;
Aug 17, 2010
Aug 17, 2010
72
Jan 7, 2011
Jan 7, 2011
73
74
return JNI_VERSION_1_4;
}
Aug 17, 2010
Aug 17, 2010
75
Jan 7, 2011
Jan 7, 2011
76
77
78
// Called before SDL_main() to initialize JNI bindings
extern "C" void SDL_Android_Init(JNIEnv* env)
{
Aug 17, 2010
Aug 17, 2010
79
80
mEnv = env;
Jan 7, 2011
Jan 7, 2011
81
__android_log_print(ANDROID_LOG_INFO, "SDL", "SDL_Android_Init()");
Aug 17, 2010
Aug 17, 2010
82
83
84
85
86
jclass cls = mEnv->FindClass ("org/libsdl/app/SDLActivity");
mActivityInstance = cls;
midCreateGLContext = mEnv->GetStaticMethodID(cls,"createGLContext","()V");
midFlipBuffers = mEnv->GetStaticMethodID(cls,"flipBuffers","()V");
Jan 13, 2011
Jan 13, 2011
87
88
89
90
midAudioInit = mEnv->GetStaticMethodID(cls, "audioInit", "(IZZI)Ljava/lang/Object;");
midAudioWriteShortBuffer = mEnv->GetStaticMethodID(cls, "audioWriteShortBuffer", "([S)V");
midAudioWriteByteBuffer = mEnv->GetStaticMethodID(cls, "audioWriteByteBuffer", "([B)V");
midAudioQuit = mEnv->GetStaticMethodID(cls, "audioQuit", "()V");
Aug 17, 2010
Aug 17, 2010
91
Jan 13, 2011
Jan 13, 2011
92
if(!midCreateGLContext || !midFlipBuffers || !midAudioInit ||
Jan 13, 2011
Jan 13, 2011
93
94
!midAudioWriteShortBuffer || !midAudioWriteByteBuffer || !midAudioQuit) {
__android_log_print(ANDROID_LOG_WARN, "SDL", "SDL: Couldn't locate Java callbacks, check that they're named and typed correctly");
Aug 17, 2010
Aug 17, 2010
95
96
97
}
}
Jan 13, 2011
Jan 13, 2011
98
99
100
101
102
103
104
105
// Resize
extern "C" void Java_org_libsdl_app_SDLActivity_onNativeResize(
JNIEnv* env, jobject obj,
jint width, jint height, jint format)
{
Android_SetScreenResolution(width, height, format);
}
Jan 7, 2011
Jan 7, 2011
106
// Keydown
Jan 13, 2011
Jan 13, 2011
107
108
extern "C" void Java_org_libsdl_app_SDLActivity_onNativeKeyDown(
JNIEnv* env, jobject obj, jint keycode)
Jan 7, 2011
Jan 7, 2011
109
{
Jan 12, 2011
Jan 12, 2011
110
Android_OnKeyDown(keycode);
Aug 17, 2010
Aug 17, 2010
111
112
}
Jan 7, 2011
Jan 7, 2011
113
// Keyup
Jan 13, 2011
Jan 13, 2011
114
115
extern "C" void Java_org_libsdl_app_SDLActivity_onNativeKeyUp(
JNIEnv* env, jobject obj, jint keycode)
Jan 7, 2011
Jan 7, 2011
116
{
Jan 12, 2011
Jan 12, 2011
117
Android_OnKeyUp(keycode);
Aug 17, 2010
Aug 17, 2010
118
119
}
Jan 7, 2011
Jan 7, 2011
120
// Touch
Jan 13, 2011
Jan 13, 2011
121
122
123
extern "C" void Java_org_libsdl_app_SDLActivity_onNativeTouch(
JNIEnv* env, jobject obj,
jint action, jfloat x, jfloat y, jfloat p)
Jan 7, 2011
Jan 7, 2011
124
{
Aug 17, 2010
Aug 17, 2010
125
126
127
128
129
130
131
132
133
#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 13, 2011
Jan 13, 2011
134
135
136
137
138
139
140
141
142
143
// Accelerometer
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;
}
Jan 7, 2011
Jan 7, 2011
144
// Quit
Jan 13, 2011
Jan 13, 2011
145
146
extern "C" void Java_org_libsdl_app_SDLActivity_nativeQuit(
JNIEnv* env, jobject obj)
Jan 7, 2011
Jan 7, 2011
147
148
149
{
// Inject a SDL_QUIT event
SDL_SendQuit();
Aug 17, 2010
Aug 17, 2010
150
151
}
Jan 13, 2011
Jan 13, 2011
152
153
extern "C" void Java_org_libsdl_app_SDLActivity_nativeRunAudioThread(
JNIEnv* env)
Jan 7, 2011
Jan 7, 2011
154
{
Jan 13, 2011
Jan 13, 2011
155
156
mVM->AttachCurrentThread(&mAudioEnv, NULL);
Android_RunAudioThread();
Aug 17, 2010
Aug 17, 2010
157
158
159
160
161
162
}
/*******************************************************************************
Functions called by SDL into Java
*******************************************************************************/
Jan 13, 2011
Jan 13, 2011
163
extern "C" void Android_JNI_CreateContext()
Jan 7, 2011
Jan 7, 2011
164
{
Jan 13, 2011
Jan 13, 2011
165
mEnv->CallStaticVoidMethod(mActivityInstance, midCreateGLContext);
Aug 17, 2010
Aug 17, 2010
166
167
}
Jan 13, 2011
Jan 13, 2011
168
extern "C" void Android_JNI_SwapWindow()
Jan 7, 2011
Jan 7, 2011
169
170
{
mEnv->CallStaticVoidMethod(mActivityInstance, midFlipBuffers);
Aug 17, 2010
Aug 17, 2010
171
172
}
Jan 13, 2011
Jan 13, 2011
173
174
175
//
// Audio support
//
Jan 13, 2011
Jan 13, 2011
176
177
178
179
static jboolean audioBuffer16Bit = JNI_FALSE;
static jboolean audioBufferStereo = JNI_FALSE;
static jobject audioBuffer = NULL;
static void* audioBufferPinned = NULL;
Jan 13, 2011
Jan 13, 2011
180
181
extern "C" int Android_JNI_OpenAudioDevice(int sampleRate, int is16Bit, int channelCount, int desiredBufferFrames)
Jan 7, 2011
Jan 7, 2011
182
{
Jan 13, 2011
Jan 13, 2011
183
int audioBufferFrames;
Aug 17, 2010
Aug 17, 2010
184
Jan 13, 2011
Jan 13, 2011
185
186
187
__android_log_print(ANDROID_LOG_VERBOSE, "SDL", "SDL audio: opening device");
audioBuffer16Bit = is16Bit;
audioBufferStereo = channelCount > 1;
Aug 17, 2010
Aug 17, 2010
188
Jan 13, 2011
Jan 13, 2011
189
audioBuffer = mEnv->CallStaticObjectMethod(mActivityInstance, midAudioInit, sampleRate, audioBuffer16Bit, audioBufferStereo, desiredBufferFrames);
Aug 17, 2010
Aug 17, 2010
190
Jan 13, 2011
Jan 13, 2011
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
if (audioBuffer == NULL) {
__android_log_print(ANDROID_LOG_WARN, "SDL", "SDL audio: didn't get back a good audio buffer!");
return 0;
}
audioBuffer = mEnv->NewGlobalRef(audioBuffer);
jboolean isCopy = JNI_FALSE;
if (audioBuffer16Bit) {
audioBufferPinned = mEnv->GetShortArrayElements((jshortArray)audioBuffer, &isCopy);
audioBufferFrames = mEnv->GetArrayLength((jshortArray)audioBuffer);
} else {
audioBufferPinned = mEnv->GetByteArrayElements((jbyteArray)audioBuffer, &isCopy);
audioBufferFrames = mEnv->GetArrayLength((jbyteArray)audioBuffer);
}
if (audioBufferStereo) {
audioBufferFrames /= 2;
}
Aug 17, 2010
Aug 17, 2010
208
Jan 13, 2011
Jan 13, 2011
209
return audioBufferFrames;
Jan 13, 2011
Jan 13, 2011
210
211
}
Jan 13, 2011
Jan 13, 2011
212
extern "C" void * Android_JNI_GetAudioBuffer()
Jan 13, 2011
Jan 13, 2011
213
{
Jan 13, 2011
Jan 13, 2011
214
215
216
//jboolean isCopy = JNI_FALSE;
//audioBufferPinned = mAudioEnv->GetPrimitiveArrayCritical((jarray)audioBuffer, &isCopy);
return audioBufferPinned;
Jan 13, 2011
Jan 13, 2011
217
218
}
Jan 13, 2011
Jan 13, 2011
219
extern "C" void Android_JNI_WriteAudioBuffer()
Jan 13, 2011
Jan 13, 2011
220
{
Jan 13, 2011
Jan 13, 2011
221
222
223
224
225
226
227
228
229
230
//mAudioEnv->ReleasePrimitiveArrayCritical((jarray)audioBuffer, audioBufferPinned, 0);
if (audioBuffer16Bit) {
mAudioEnv->ReleaseShortArrayElements((jshortArray)audioBuffer, (jshort *)audioBufferPinned, JNI_COMMIT);
mAudioEnv->CallStaticVoidMethod(mActivityInstance, midAudioWriteShortBuffer, (jshortArray)audioBuffer);
} else {
mAudioEnv->ReleaseByteArrayElements((jbyteArray)audioBuffer, (jbyte *)audioBufferPinned, JNI_COMMIT);
mAudioEnv->CallStaticVoidMethod(mActivityInstance, midAudioWriteByteBuffer, (jbyteArray)audioBuffer);
}
/* JNI_COMMIT means the changes are committed to the VM but the buffer remains pinned */
Jan 13, 2011
Jan 13, 2011
231
232
233
234
}
extern "C" void Android_JNI_CloseAudioDevice()
{
Jan 13, 2011
Jan 13, 2011
235
mEnv->CallStaticVoidMethod(mActivityInstance, midAudioQuit);
Aug 17, 2010
Aug 17, 2010
236
Jan 13, 2011
Jan 13, 2011
237
238
mEnv->DeleteGlobalRef(audioBuffer);
audioBuffer = NULL;
Aug 17, 2010
Aug 17, 2010
239
}
Jan 12, 2011
Jan 12, 2011
240
241
/* vi: set ts=4 sw=4 expandtab: */