Skip to content

Latest commit

 

History

History
2514 lines (2094 loc) · 90.8 KB

SDL_android.c

File metadata and controls

2514 lines (2094 loc) · 90.8 KB
 
1
2
/*
Simple DirectMedia Layer
Jan 5, 2019
Jan 5, 2019
3
Copyright (C) 1997-2019 Sam Lantinga <slouken@libsdl.org>
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
*/
#include "../../SDL_internal.h"
#include "SDL_stdinc.h"
#include "SDL_assert.h"
#include "SDL_hints.h"
#include "SDL_log.h"
Aug 28, 2017
Aug 28, 2017
26
#include "SDL_main.h"
27
28
29
30
31
32
#ifdef __ANDROID__
#include "SDL_system.h"
#include "SDL_android.h"
Oct 26, 2017
Oct 26, 2017
33
34
#include "keyinfotable.h"
35
36
37
38
39
40
41
#include "../../events/SDL_events_c.h"
#include "../../video/android/SDL_androidkeyboard.h"
#include "../../video/android/SDL_androidmouse.h"
#include "../../video/android/SDL_androidtouch.h"
#include "../../video/android/SDL_androidvideo.h"
#include "../../video/android/SDL_androidwindow.h"
#include "../../joystick/android/SDL_sysjoystick_c.h"
Aug 12, 2017
Aug 12, 2017
42
#include "../../haptic/android/SDL_syshaptic_c.h"
43
44
45
46
47
#include <android/log.h>
#include <pthread.h>
#include <sys/types.h>
#include <unistd.h>
Aug 28, 2017
Aug 28, 2017
48
#include <dlfcn.h>
Dec 2, 2016
Dec 2, 2016
49
/* #define LOG_TAG "SDL_android" */
50
51
52
53
54
/* #define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__) */
/* #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__) */
#define LOGI(...) do {} while (0)
#define LOGE(...) do {} while (0)
Dec 2, 2016
Dec 2, 2016
55
56
57
58
59
#define SDL_JAVA_PREFIX org_libsdl_app
#define CONCAT1(prefix, class, function) CONCAT2(prefix, class, function)
#define CONCAT2(prefix, class, function) Java_ ## prefix ## _ ## class ## _ ## function
#define SDL_JAVA_INTERFACE(function) CONCAT1(SDL_JAVA_PREFIX, SDLActivity, function)
Sep 22, 2017
Sep 22, 2017
60
61
#define SDL_JAVA_AUDIO_INTERFACE(function) CONCAT1(SDL_JAVA_PREFIX, SDLAudioManager, function)
#define SDL_JAVA_CONTROLLER_INTERFACE(function) CONCAT1(SDL_JAVA_PREFIX, SDLControllerManager, function)
Dec 2, 2016
Dec 2, 2016
62
63
#define SDL_JAVA_INTERFACE_INPUT_CONNECTION(function) CONCAT1(SDL_JAVA_PREFIX, SDLInputConnection, function)
Oct 10, 2018
Oct 10, 2018
64
65
66
67
/* Audio encoding definitions */
#define ENCODING_PCM_8BIT 3
#define ENCODING_PCM_16BIT 2
#define ENCODING_PCM_FLOAT 4
Dec 2, 2016
Dec 2, 2016
68
69
/* Java class SDLActivity */
Aug 28, 2017
Aug 28, 2017
70
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativeSetupJNI)(
Jan 3, 2019
Jan 3, 2019
71
JNIEnv *mEnv, jclass cls);
Aug 28, 2017
Aug 28, 2017
72
73
JNIEXPORT int JNICALL SDL_JAVA_INTERFACE(nativeRunMain)(
Jan 3, 2019
Jan 3, 2019
74
JNIEnv *env, jclass cls,
Aug 28, 2017
Aug 28, 2017
75
76
jstring library, jstring function, jobject array);
Dec 2, 2016
Dec 2, 2016
77
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeDropFile)(
Jan 3, 2019
Jan 3, 2019
78
JNIEnv *env, jclass jcls,
Dec 2, 2016
Dec 2, 2016
79
80
81
jstring filename);
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeResize)(
Jan 3, 2019
Jan 3, 2019
82
JNIEnv *env, jclass jcls,
Jun 8, 2018
Jun 8, 2018
83
jint surfaceWidth, jint surfaceHeight,
Sep 24, 2018
Sep 24, 2018
84
jint deviceWidth, jint deviceHeight, jint format, jfloat rate);
Dec 2, 2016
Dec 2, 2016
85
Jan 9, 2019
Jan 9, 2019
86
87
88
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeSurfaceCreated)(
JNIEnv *env, jclass jcls);
Dec 2, 2016
Dec 2, 2016
89
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeSurfaceChanged)(
Jan 3, 2019
Jan 3, 2019
90
JNIEnv *env, jclass jcls);
Dec 2, 2016
Dec 2, 2016
91
92
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeSurfaceDestroyed)(
Jan 3, 2019
Jan 3, 2019
93
JNIEnv *env, jclass jcls);
Dec 2, 2016
Dec 2, 2016
94
95
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeKeyDown)(
Jan 3, 2019
Jan 3, 2019
96
JNIEnv *env, jclass jcls,
Dec 2, 2016
Dec 2, 2016
97
98
99
jint keycode);
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeKeyUp)(
Jan 3, 2019
Jan 3, 2019
100
JNIEnv *env, jclass jcls,
Dec 2, 2016
Dec 2, 2016
101
102
103
jint keycode);
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeKeyboardFocusLost)(
Jan 3, 2019
Jan 3, 2019
104
JNIEnv *env, jclass jcls);
Dec 2, 2016
Dec 2, 2016
105
106
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeTouch)(
Jan 3, 2019
Jan 3, 2019
107
JNIEnv *env, jclass jcls,
Dec 2, 2016
Dec 2, 2016
108
109
110
111
jint touch_device_id_in, jint pointer_finger_id_in,
jint action, jfloat x, jfloat y, jfloat p);
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeMouse)(
Jan 3, 2019
Jan 3, 2019
112
JNIEnv *env, jclass jcls,
Jun 5, 2018
Jun 5, 2018
113
jint button, jint action, jfloat x, jfloat y, jboolean relative);
Dec 2, 2016
Dec 2, 2016
114
115
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeAccel)(
Jan 3, 2019
Jan 3, 2019
116
JNIEnv *env, jclass jcls,
Dec 2, 2016
Dec 2, 2016
117
118
jfloat x, jfloat y, jfloat z);
Aug 28, 2017
Aug 28, 2017
119
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeClipboardChanged)(
Jan 3, 2019
Jan 3, 2019
120
JNIEnv *env, jclass jcls);
Aug 28, 2017
Aug 28, 2017
121
Dec 2, 2016
Dec 2, 2016
122
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativeLowMemory)(
Jan 3, 2019
Jan 3, 2019
123
JNIEnv *env, jclass cls);
Dec 2, 2016
Dec 2, 2016
124
Jan 10, 2019
Jan 10, 2019
125
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativeSendQuit)(
Jan 3, 2019
Jan 3, 2019
126
JNIEnv *env, jclass cls);
Dec 2, 2016
Dec 2, 2016
127
Jan 10, 2019
Jan 10, 2019
128
129
130
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativeQuit)(
JNIEnv *env, jclass cls);
Dec 2, 2016
Dec 2, 2016
131
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativePause)(
Jan 3, 2019
Jan 3, 2019
132
JNIEnv *env, jclass cls);
Dec 2, 2016
Dec 2, 2016
133
134
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativeResume)(
Jan 3, 2019
Jan 3, 2019
135
JNIEnv *env, jclass cls);
Dec 2, 2016
Dec 2, 2016
136
137
JNIEXPORT jstring JNICALL SDL_JAVA_INTERFACE(nativeGetHint)(
Jan 3, 2019
Jan 3, 2019
138
JNIEnv *env, jclass cls,
Dec 2, 2016
Dec 2, 2016
139
140
jstring name);
Nov 4, 2017
Nov 4, 2017
141
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativeSetenv)(
Jan 3, 2019
Jan 3, 2019
142
JNIEnv *env, jclass cls,
Nov 4, 2017
Nov 4, 2017
143
144
145
jstring name, jstring value);
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativeEnvironmentVariablesSet)(
Jan 3, 2019
Jan 3, 2019
146
JNIEnv *env, jclass cls);
Nov 4, 2017
Nov 4, 2017
147
Aug 23, 2018
Aug 23, 2018
148
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeOrientationChanged)(
Jan 3, 2019
Jan 3, 2019
149
JNIEnv *env, jclass cls,
Aug 23, 2018
Aug 23, 2018
150
151
jint orientation);
Dec 2, 2016
Dec 2, 2016
152
153
/* Java class SDLInputConnection */
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE_INPUT_CONNECTION(nativeCommitText)(
Jan 3, 2019
Jan 3, 2019
154
JNIEnv *env, jclass cls,
Dec 2, 2016
Dec 2, 2016
155
156
jstring text, jint newCursorPosition);
Sep 27, 2018
Sep 27, 2018
157
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE_INPUT_CONNECTION(nativeGenerateScancodeForUnichar)(
Jan 3, 2019
Jan 3, 2019
158
JNIEnv *env, jclass cls,
Sep 27, 2018
Sep 27, 2018
159
160
jchar chUnicode);
Dec 2, 2016
Dec 2, 2016
161
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE_INPUT_CONNECTION(nativeSetComposingText)(
Jan 3, 2019
Jan 3, 2019
162
JNIEnv *env, jclass cls,
Dec 2, 2016
Dec 2, 2016
163
164
jstring text, jint newCursorPosition);
Sep 22, 2017
Sep 22, 2017
165
166
167
168
169
170
171
172
173
/* Java class SDLAudioManager */
JNIEXPORT void JNICALL SDL_JAVA_AUDIO_INTERFACE(nativeSetupJNI)(
JNIEnv *env, jclass jcls);
/* Java class SDLControllerManager */
JNIEXPORT void JNICALL SDL_JAVA_CONTROLLER_INTERFACE(nativeSetupJNI)(
JNIEnv *env, jclass jcls);
JNIEXPORT jint JNICALL SDL_JAVA_CONTROLLER_INTERFACE(onNativePadDown)(
Jan 3, 2019
Jan 3, 2019
174
JNIEnv *env, jclass jcls,
Sep 22, 2017
Sep 22, 2017
175
176
177
jint device_id, jint keycode);
JNIEXPORT jint JNICALL SDL_JAVA_CONTROLLER_INTERFACE(onNativePadUp)(
Jan 3, 2019
Jan 3, 2019
178
JNIEnv *env, jclass jcls,
Sep 22, 2017
Sep 22, 2017
179
180
181
jint device_id, jint keycode);
JNIEXPORT void JNICALL SDL_JAVA_CONTROLLER_INTERFACE(onNativeJoy)(
Jan 3, 2019
Jan 3, 2019
182
JNIEnv *env, jclass jcls,
Sep 22, 2017
Sep 22, 2017
183
184
185
jint device_id, jint axis, jfloat value);
JNIEXPORT void JNICALL SDL_JAVA_CONTROLLER_INTERFACE(onNativeHat)(
Jan 3, 2019
Jan 3, 2019
186
JNIEnv *env, jclass jcls,
Sep 22, 2017
Sep 22, 2017
187
188
189
jint device_id, jint hat_id, jint x, jint y);
JNIEXPORT jint JNICALL SDL_JAVA_CONTROLLER_INTERFACE(nativeAddJoystick)(
Jan 3, 2019
Jan 3, 2019
190
JNIEnv *env, jclass jcls,
Mar 6, 2018
Mar 6, 2018
191
192
jint device_id, jstring device_name, jstring device_desc, jint vendor_id, jint product_id,
jboolean is_accelerometer, jint button_mask, jint naxes, jint nhats, jint nballs);
Sep 22, 2017
Sep 22, 2017
193
194
JNIEXPORT jint JNICALL SDL_JAVA_CONTROLLER_INTERFACE(nativeRemoveJoystick)(
Jan 3, 2019
Jan 3, 2019
195
JNIEnv *env, jclass jcls,
Sep 22, 2017
Sep 22, 2017
196
197
198
jint device_id);
JNIEXPORT jint JNICALL SDL_JAVA_CONTROLLER_INTERFACE(nativeAddHaptic)(
Jan 3, 2019
Jan 3, 2019
199
JNIEnv *env, jclass jcls,
Sep 22, 2017
Sep 22, 2017
200
201
202
jint device_id, jstring device_name);
JNIEXPORT jint JNICALL SDL_JAVA_CONTROLLER_INTERFACE(nativeRemoveHaptic)(
Jan 3, 2019
Jan 3, 2019
203
JNIEnv *env, jclass jcls,
Sep 22, 2017
Sep 22, 2017
204
205
206
jint device_id);
Dec 2, 2016
Dec 2, 2016
207
208
209
210
/* Uncomment this to log messages entering and exiting methods in this file */
/* #define DEBUG_JNI */
Jan 3, 2019
Jan 3, 2019
211
static void Android_JNI_ThreadDestroyed(void *);
Sep 27, 2018
Sep 27, 2018
212
static void checkJNIReady(void);
213
214
215
216
217
218
219
220
221
222
223
/*******************************************************************************
This file links the Java side of Android with libsdl
*******************************************************************************/
#include <jni.h>
/*******************************************************************************
Globals
*******************************************************************************/
static pthread_key_t mThreadKey;
Jan 3, 2019
Jan 3, 2019
224
static JavaVM *mJavaVM;
225
226
227
228
229
230
/* Main activity */
static jclass mActivityClass;
/* method signatures */
static jmethodID midGetNativeSurface;
Jan 2, 2019
Jan 2, 2019
231
static jmethodID midSetSurfaceViewFormat;
Aug 14, 2017
Aug 14, 2017
232
static jmethodID midSetActivityTitle;
Feb 12, 2018
Feb 12, 2018
233
static jmethodID midSetWindowStyle;
Aug 14, 2017
Aug 14, 2017
234
235
static jmethodID midSetOrientation;
static jmethodID midGetContext;
Aug 22, 2018
Aug 22, 2018
236
static jmethodID midIsTablet;
Feb 6, 2018
Feb 6, 2018
237
static jmethodID midIsAndroidTV;
Jun 5, 2018
Jun 5, 2018
238
static jmethodID midIsChromebook;
Jun 18, 2018
Jun 18, 2018
239
static jmethodID midIsDeXMode;
Jul 12, 2018
Jul 12, 2018
240
static jmethodID midManualBackButton;
Aug 14, 2017
Aug 14, 2017
241
242
243
244
static jmethodID midInputGetInputDeviceIds;
static jmethodID midSendMessage;
static jmethodID midShowTextInput;
static jmethodID midIsScreenKeyboardShown;
Aug 28, 2017
Aug 28, 2017
245
246
247
static jmethodID midClipboardSetText;
static jmethodID midClipboardGetText;
static jmethodID midClipboardHasText;
Sep 22, 2017
Sep 22, 2017
248
static jmethodID midOpenAPKExpansionInputStream;
Nov 4, 2017
Nov 4, 2017
249
static jmethodID midGetManifestEnvironmentVariables;
Oct 31, 2017
Oct 31, 2017
250
static jmethodID midGetDisplayDPI;
Mar 16, 2018
Mar 16, 2018
251
252
253
static jmethodID midCreateCustomCursor;
static jmethodID midSetCustomCursor;
static jmethodID midSetSystemCursor;
Jun 5, 2018
Jun 5, 2018
254
255
static jmethodID midSupportsRelativeMouse;
static jmethodID midSetRelativeMouseEnabled;
Aug 28, 2017
Aug 28, 2017
256
Sep 22, 2017
Sep 22, 2017
257
258
259
260
261
262
/* audio manager */
static jclass mAudioManagerClass;
/* method signatures */
static jmethodID midAudioOpen;
static jmethodID midAudioWriteByteBuffer;
Oct 10, 2018
Oct 10, 2018
263
264
static jmethodID midAudioWriteShortBuffer;
static jmethodID midAudioWriteFloatBuffer;
Sep 22, 2017
Sep 22, 2017
265
266
267
static jmethodID midAudioClose;
static jmethodID midCaptureOpen;
static jmethodID midCaptureReadByteBuffer;
Oct 10, 2018
Oct 10, 2018
268
269
static jmethodID midCaptureReadShortBuffer;
static jmethodID midCaptureReadFloatBuffer;
Sep 22, 2017
Sep 22, 2017
270
static jmethodID midCaptureClose;
Jan 10, 2019
Jan 10, 2019
271
static jmethodID midAudioSetThreadPriority;
Sep 22, 2017
Sep 22, 2017
272
273
274
275
276
277
278
279
/* controller manager */
static jclass mControllerManagerClass;
/* method signatures */
static jmethodID midPollInputDevices;
static jmethodID midPollHapticDevices;
static jmethodID midHapticRun;
Aug 24, 2018
Aug 24, 2018
280
static jmethodID midHapticStop;
Aug 12, 2017
Aug 12, 2017
282
283
284
/* static fields */
static jfieldID fidSeparateMouseAndTouch;
285
286
287
288
/* Accelerometer data storage */
static float fLastAccelerometer[3];
static SDL_bool bHasNewData;
Nov 5, 2017
Nov 5, 2017
289
static SDL_bool bHasEnvironmentVariables = SDL_FALSE;
Nov 4, 2017
Nov 4, 2017
290
291
292
293
294
295
/*******************************************************************************
Functions called by JNI
*******************************************************************************/
/* Library init */
Jan 3, 2019
Jan 3, 2019
296
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved)
297
298
299
300
{
JNIEnv *env;
mJavaVM = vm;
LOGI("JNI_OnLoad called");
Jan 3, 2019
Jan 3, 2019
301
if ((*mJavaVM)->GetEnv(mJavaVM, (void **) &env, JNI_VERSION_1_4) != JNI_OK) {
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
LOGE("Failed to get the environment using GetEnv()");
return -1;
}
/*
* Create mThreadKey so we can keep track of the JNIEnv assigned to each thread
* Refer to http://developer.android.com/guide/practices/design/jni.html for the rationale behind this
*/
if (pthread_key_create(&mThreadKey, Android_JNI_ThreadDestroyed) != 0) {
__android_log_print(ANDROID_LOG_ERROR, "SDL", "Error initializing pthread key");
}
Android_JNI_SetupThread();
return JNI_VERSION_1_4;
}
Sep 22, 2017
Sep 22, 2017
317
318
319
void checkJNIReady()
{
if (!mActivityClass || !mAudioManagerClass || !mControllerManagerClass) {
Dec 30, 2018
Dec 30, 2018
320
/* We aren't fully initialized, let's just return. */
Sep 22, 2017
Sep 22, 2017
321
322
323
return;
}
Dec 30, 2018
Dec 30, 2018
324
SDL_SetMainReady();
Sep 22, 2017
Sep 22, 2017
325
326
327
}
/* Activity initialization -- called before SDL_main() to initialize JNI bindings */
Jan 3, 2019
Jan 3, 2019
328
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativeSetupJNI)(JNIEnv *mEnv, jclass cls)
Aug 28, 2017
Aug 28, 2017
330
__android_log_print(ANDROID_LOG_VERBOSE, "SDL", "nativeSetupJNI()");
Jan 3, 2019
Jan 3, 2019
332
/* Use a mutex to prevent concurrency issues between Java Activity and Native thread code, when using 'Android_Window'.
Jan 3, 2019
Jan 3, 2019
333
334
* (Eg. Java sending Touch events, while native code is destroying the main SDL_Window. )
*/
Jan 3, 2019
Jan 3, 2019
335
336
if (Android_ActivityMutex == NULL) {
Android_ActivityMutex = SDL_CreateMutex(); /* Could this be created twice if onCreate() is called a second time ? */
Jan 3, 2019
Jan 3, 2019
337
338
}
Jan 3, 2019
Jan 3, 2019
339
340
if (Android_ActivityMutex == NULL) {
__android_log_print(ANDROID_LOG_VERBOSE, "SDL", "failed to create Android_ActivityMutex mutex");
Jan 3, 2019
Jan 3, 2019
341
342
}
343
344
345
346
347
348
Android_JNI_SetupThread();
mActivityClass = (jclass)((*mEnv)->NewGlobalRef(mEnv, cls));
midGetNativeSurface = (*mEnv)->GetStaticMethodID(mEnv, mActivityClass,
"getNativeSurface","()Landroid/view/Surface;");
Jan 2, 2019
Jan 2, 2019
349
350
midSetSurfaceViewFormat = (*mEnv)->GetStaticMethodID(mEnv, mActivityClass,
"setSurfaceViewFormat","(I)V");
Aug 14, 2017
Aug 14, 2017
351
352
midSetActivityTitle = (*mEnv)->GetStaticMethodID(mEnv, mActivityClass,
"setActivityTitle","(Ljava/lang/String;)Z");
Feb 12, 2018
Feb 12, 2018
353
354
midSetWindowStyle = (*mEnv)->GetStaticMethodID(mEnv, mActivityClass,
"setWindowStyle","(Z)V");
Aug 14, 2017
Aug 14, 2017
355
356
357
358
midSetOrientation = (*mEnv)->GetStaticMethodID(mEnv, mActivityClass,
"setOrientation","(IIZLjava/lang/String;)V");
midGetContext = (*mEnv)->GetStaticMethodID(mEnv, mActivityClass,
"getContext","()Landroid/content/Context;");
Aug 22, 2018
Aug 22, 2018
359
360
midIsTablet = (*mEnv)->GetStaticMethodID(mEnv, mActivityClass,
"isTablet", "()Z");
Feb 6, 2018
Feb 6, 2018
361
362
midIsAndroidTV = (*mEnv)->GetStaticMethodID(mEnv, mActivityClass,
"isAndroidTV","()Z");
Jun 5, 2018
Jun 5, 2018
363
364
midIsChromebook = (*mEnv)->GetStaticMethodID(mEnv, mActivityClass,
"isChromebook", "()Z");
Jun 18, 2018
Jun 18, 2018
365
366
midIsDeXMode = (*mEnv)->GetStaticMethodID(mEnv, mActivityClass,
"isDeXMode", "()Z");
Jul 12, 2018
Jul 12, 2018
367
368
midManualBackButton = (*mEnv)->GetStaticMethodID(mEnv, mActivityClass,
"manualBackButton", "()V");
Aug 14, 2017
Aug 14, 2017
369
370
371
372
373
374
375
376
midInputGetInputDeviceIds = (*mEnv)->GetStaticMethodID(mEnv, mActivityClass,
"inputGetInputDeviceIds", "(I)[I");
midSendMessage = (*mEnv)->GetStaticMethodID(mEnv, mActivityClass,
"sendMessage", "(II)Z");
midShowTextInput = (*mEnv)->GetStaticMethodID(mEnv, mActivityClass,
"showTextInput", "(IIII)Z");
midIsScreenKeyboardShown = (*mEnv)->GetStaticMethodID(mEnv, mActivityClass,
"isScreenKeyboardShown","()Z");
Aug 28, 2017
Aug 28, 2017
377
378
379
380
381
382
midClipboardSetText = (*mEnv)->GetStaticMethodID(mEnv, mActivityClass,
"clipboardSetText", "(Ljava/lang/String;)V");
midClipboardGetText = (*mEnv)->GetStaticMethodID(mEnv, mActivityClass,
"clipboardGetText", "()Ljava/lang/String;");
midClipboardHasText = (*mEnv)->GetStaticMethodID(mEnv, mActivityClass,
"clipboardHasText", "()Z");
Sep 22, 2017
Sep 22, 2017
383
384
midOpenAPKExpansionInputStream = (*mEnv)->GetStaticMethodID(mEnv, mActivityClass,
"openAPKExpansionInputStream", "(Ljava/lang/String;)Ljava/io/InputStream;");
Nov 4, 2017
Nov 4, 2017
386
midGetManifestEnvironmentVariables = (*mEnv)->GetStaticMethodID(mEnv, mActivityClass,
Nov 5, 2017
Nov 5, 2017
387
"getManifestEnvironmentVariables", "()Z");
Oct 24, 2017
Oct 24, 2017
388
Oct 31, 2017
Oct 31, 2017
389
midGetDisplayDPI = (*mEnv)->GetStaticMethodID(mEnv, mActivityClass, "getDisplayDPI", "()Landroid/util/DisplayMetrics;");
Mar 16, 2018
Mar 16, 2018
390
midCreateCustomCursor = (*mEnv)->GetStaticMethodID(mEnv, mActivityClass, "createCustomCursor", "([IIIII)I");
Mar 16, 2018
Mar 16, 2018
391
392
midSetCustomCursor = (*mEnv)->GetStaticMethodID(mEnv, mActivityClass, "setCustomCursor", "(I)Z");
midSetSystemCursor = (*mEnv)->GetStaticMethodID(mEnv, mActivityClass, "setSystemCursor", "(I)Z");
Oct 31, 2017
Oct 31, 2017
393
Jun 5, 2018
Jun 5, 2018
394
395
396
midSupportsRelativeMouse = (*mEnv)->GetStaticMethodID(mEnv, mActivityClass, "supportsRelativeMouse", "()Z");
midSetRelativeMouseEnabled = (*mEnv)->GetStaticMethodID(mEnv, mActivityClass, "setRelativeMouseEnabled", "(Z)Z");
Aug 21, 2018
Aug 21, 2018
397
Jan 2, 2019
Jan 2, 2019
398
if (!midGetNativeSurface || !midSetSurfaceViewFormat ||
Aug 22, 2018
Aug 22, 2018
399
!midSetActivityTitle || !midSetWindowStyle || !midSetOrientation || !midGetContext || !midIsTablet || !midIsAndroidTV || !midInputGetInputDeviceIds ||
Nov 4, 2017
Nov 4, 2017
400
!midSendMessage || !midShowTextInput || !midIsScreenKeyboardShown ||
Sep 22, 2017
Sep 22, 2017
401
!midClipboardSetText || !midClipboardGetText || !midClipboardHasText ||
Mar 16, 2018
Mar 16, 2018
402
!midOpenAPKExpansionInputStream || !midGetManifestEnvironmentVariables || !midGetDisplayDPI ||
Jun 5, 2018
Jun 5, 2018
403
!midCreateCustomCursor || !midSetCustomCursor || !midSetSystemCursor || !midSupportsRelativeMouse || !midSetRelativeMouseEnabled ||
Aug 22, 2018
Aug 22, 2018
404
!midIsChromebook || !midIsDeXMode || !midManualBackButton) {
Aug 28, 2017
Aug 28, 2017
405
__android_log_print(ANDROID_LOG_WARN, "SDL", "Missing some Java callbacks, do you have the latest version of SDLActivity.java?");
Aug 12, 2017
Aug 12, 2017
407
408
fidSeparateMouseAndTouch = (*mEnv)->GetStaticFieldID(mEnv, mActivityClass, "mSeparateMouseAndTouch", "Z");
Aug 14, 2017
Aug 14, 2017
409
Aug 12, 2017
Aug 12, 2017
410
if (!fidSeparateMouseAndTouch) {
Aug 28, 2017
Aug 28, 2017
411
412
413
__android_log_print(ANDROID_LOG_WARN, "SDL", "Missing some Java static fields, do you have the latest version of SDLActivity.java?");
}
Sep 22, 2017
Sep 22, 2017
414
415
416
417
checkJNIReady();
}
/* Audio initialization -- called before SDL_main() to initialize JNI bindings */
Jan 3, 2019
Jan 3, 2019
418
JNIEXPORT void JNICALL SDL_JAVA_AUDIO_INTERFACE(nativeSetupJNI)(JNIEnv *mEnv, jclass cls)
Sep 22, 2017
Sep 22, 2017
419
420
421
422
423
424
425
426
{
__android_log_print(ANDROID_LOG_VERBOSE, "SDL", "AUDIO nativeSetupJNI()");
Android_JNI_SetupThread();
mAudioManagerClass = (jclass)((*mEnv)->NewGlobalRef(mEnv, cls));
midAudioOpen = (*mEnv)->GetStaticMethodID(mEnv, mAudioManagerClass,
Oct 10, 2018
Oct 10, 2018
427
"audioOpen", "(IIII)[I");
Sep 22, 2017
Sep 22, 2017
428
429
midAudioWriteByteBuffer = (*mEnv)->GetStaticMethodID(mEnv, mAudioManagerClass,
"audioWriteByteBuffer", "([B)V");
Oct 10, 2018
Oct 10, 2018
430
431
432
433
midAudioWriteShortBuffer = (*mEnv)->GetStaticMethodID(mEnv, mAudioManagerClass,
"audioWriteShortBuffer", "([S)V");
midAudioWriteFloatBuffer = (*mEnv)->GetStaticMethodID(mEnv, mAudioManagerClass,
"audioWriteFloatBuffer", "([F)V");
Sep 22, 2017
Sep 22, 2017
434
435
436
midAudioClose = (*mEnv)->GetStaticMethodID(mEnv, mAudioManagerClass,
"audioClose", "()V");
midCaptureOpen = (*mEnv)->GetStaticMethodID(mEnv, mAudioManagerClass,
Oct 10, 2018
Oct 10, 2018
437
"captureOpen", "(IIII)[I");
Sep 22, 2017
Sep 22, 2017
438
439
midCaptureReadByteBuffer = (*mEnv)->GetStaticMethodID(mEnv, mAudioManagerClass,
"captureReadByteBuffer", "([BZ)I");
Oct 10, 2018
Oct 10, 2018
440
441
442
443
midCaptureReadShortBuffer = (*mEnv)->GetStaticMethodID(mEnv, mAudioManagerClass,
"captureReadShortBuffer", "([SZ)I");
midCaptureReadFloatBuffer = (*mEnv)->GetStaticMethodID(mEnv, mAudioManagerClass,
"captureReadFloatBuffer", "([FZ)I");
Sep 22, 2017
Sep 22, 2017
444
445
midCaptureClose = (*mEnv)->GetStaticMethodID(mEnv, mAudioManagerClass,
"captureClose", "()V");
Jan 10, 2019
Jan 10, 2019
446
447
midAudioSetThreadPriority = (*mEnv)->GetStaticMethodID(mEnv, mAudioManagerClass,
"audioSetThreadPriority", "(ZI)V");
Sep 22, 2017
Sep 22, 2017
448
Oct 10, 2018
Oct 10, 2018
449
if (!midAudioOpen || !midAudioWriteByteBuffer || !midAudioWriteShortBuffer || !midAudioWriteFloatBuffer || !midAudioClose ||
Jan 10, 2019
Jan 10, 2019
450
!midCaptureOpen || !midCaptureReadByteBuffer || !midCaptureReadShortBuffer || !midCaptureReadFloatBuffer || !midCaptureClose || !midAudioSetThreadPriority) {
Sep 22, 2017
Sep 22, 2017
451
452
453
454
455
456
457
__android_log_print(ANDROID_LOG_WARN, "SDL", "Missing some Java callbacks, do you have the latest version of SDLAudioManager.java?");
}
checkJNIReady();
}
/* Controller initialization -- called before SDL_main() to initialize JNI bindings */
Jan 3, 2019
Jan 3, 2019
458
JNIEXPORT void JNICALL SDL_JAVA_CONTROLLER_INTERFACE(nativeSetupJNI)(JNIEnv *mEnv, jclass cls)
Sep 22, 2017
Sep 22, 2017
459
460
461
462
463
464
465
466
467
468
469
470
{
__android_log_print(ANDROID_LOG_VERBOSE, "SDL", "CONTROLLER nativeSetupJNI()");
Android_JNI_SetupThread();
mControllerManagerClass = (jclass)((*mEnv)->NewGlobalRef(mEnv, cls));
midPollInputDevices = (*mEnv)->GetStaticMethodID(mEnv, mControllerManagerClass,
"pollInputDevices", "()V");
midPollHapticDevices = (*mEnv)->GetStaticMethodID(mEnv, mControllerManagerClass,
"pollHapticDevices", "()V");
midHapticRun = (*mEnv)->GetStaticMethodID(mEnv, mControllerManagerClass,
Oct 16, 2018
Oct 16, 2018
471
"hapticRun", "(IFI)V");
Aug 24, 2018
Aug 24, 2018
472
473
midHapticStop = (*mEnv)->GetStaticMethodID(mEnv, mControllerManagerClass,
"hapticStop", "(I)V");
Sep 22, 2017
Sep 22, 2017
474
Aug 24, 2018
Aug 24, 2018
475
if (!midPollInputDevices || !midPollHapticDevices || !midHapticRun || !midHapticStop) {
Sep 22, 2017
Sep 22, 2017
476
477
478
479
__android_log_print(ANDROID_LOG_WARN, "SDL", "Missing some Java callbacks, do you have the latest version of SDLControllerManager.java?");
}
checkJNIReady();
Aug 28, 2017
Aug 28, 2017
480
481
482
483
484
485
}
/* SDL main function prototype */
typedef int (*SDL_main_func)(int argc, char *argv[]);
/* Start up the SDL app */
Jan 3, 2019
Jan 3, 2019
486
JNIEXPORT int JNICALL SDL_JAVA_INTERFACE(nativeRunMain)(JNIEnv *env, jclass cls, jstring library, jstring function, jobject array)
Aug 28, 2017
Aug 28, 2017
487
488
489
490
491
{
int status = -1;
const char *library_file;
void *library_handle;
Aug 28, 2017
Aug 28, 2017
492
493
__android_log_print(ANDROID_LOG_VERBOSE, "SDL", "nativeRunMain()");
Aug 28, 2017
Aug 28, 2017
494
495
496
497
498
499
500
501
502
503
504
505
506
library_file = (*env)->GetStringUTFChars(env, library, NULL);
library_handle = dlopen(library_file, RTLD_GLOBAL);
if (library_handle) {
const char *function_name;
SDL_main_func SDL_main;
function_name = (*env)->GetStringUTFChars(env, function, NULL);
SDL_main = (SDL_main_func)dlsym(library_handle, function_name);
if (SDL_main) {
int i;
int argc;
int len;
char **argv;
Oct 23, 2018
Oct 23, 2018
507
SDL_bool isstack;
Aug 28, 2017
Aug 28, 2017
508
509
510
/* Prepare the arguments. */
len = (*env)->GetArrayLength(env, array);
Jan 3, 2019
Jan 3, 2019
511
argv = SDL_small_alloc(char *, 1 + len + 1, &isstack); /* !!! FIXME: check for NULL */
Aug 28, 2017
Aug 28, 2017
512
513
514
515
516
517
argc = 0;
/* Use the name "app_process" so PHYSFS_platformCalcBaseDir() works.
https://bitbucket.org/MartinFelis/love-android-sdl2/issue/23/release-build-crash-on-start
*/
argv[argc++] = SDL_strdup("app_process");
for (i = 0; i < len; ++i) {
Jan 3, 2019
Jan 3, 2019
518
519
const char *utf;
char *arg = NULL;
Aug 28, 2017
Aug 28, 2017
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
jstring string = (*env)->GetObjectArrayElement(env, array, i);
if (string) {
utf = (*env)->GetStringUTFChars(env, string, 0);
if (utf) {
arg = SDL_strdup(utf);
(*env)->ReleaseStringUTFChars(env, string, utf);
}
(*env)->DeleteLocalRef(env, string);
}
if (!arg) {
arg = SDL_strdup("");
}
argv[argc++] = arg;
}
argv[argc] = NULL;
/* Run the application. */
status = SDL_main(argc, argv);
/* Release the arguments. */
for (i = 0; i < argc; ++i) {
SDL_free(argv[i]);
}
Oct 23, 2018
Oct 23, 2018
544
SDL_small_free(argv, isstack);
Aug 28, 2017
Aug 28, 2017
545
546
547
548
549
550
551
552
553
554
} else {
__android_log_print(ANDROID_LOG_ERROR, "SDL", "nativeRunMain(): Couldn't find function %s in library %s", function_name, library_file);
}
(*env)->ReleaseStringUTFChars(env, function, function_name);
dlclose(library_handle);
} else {
__android_log_print(ANDROID_LOG_ERROR, "SDL", "nativeRunMain(): Couldn't load library %s", library_file);
Aug 12, 2017
Aug 12, 2017
555
}
Aug 28, 2017
Aug 28, 2017
556
557
558
559
(*env)->ReleaseStringUTFChars(env, library, library_file);
/* Do not issue an exit or the whole application will terminate instead of just the SDL thread */
/* exit(status); */
Aug 12, 2017
Aug 12, 2017
560
Aug 28, 2017
Aug 28, 2017
561
return status;
562
563
564
}
/* Drop file */
Dec 2, 2016
Dec 2, 2016
565
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeDropFile)(
Jan 3, 2019
Jan 3, 2019
566
JNIEnv *env, jclass jcls,
567
568
569
jstring filename)
{
const char *path = (*env)->GetStringUTFChars(env, filename, NULL);
Jan 5, 2016
Jan 5, 2016
570
SDL_SendDropFile(NULL, path);
571
(*env)->ReleaseStringUTFChars(env, filename, path);
Jan 5, 2016
Jan 5, 2016
572
SDL_SendDropComplete(NULL);
573
574
575
}
/* Resize */
Dec 2, 2016
Dec 2, 2016
576
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeResize)(
Jan 3, 2019
Jan 3, 2019
577
JNIEnv *env, jclass jcls,
Jun 8, 2018
Jun 8, 2018
578
jint surfaceWidth, jint surfaceHeight,
Sep 24, 2018
Sep 24, 2018
579
jint deviceWidth, jint deviceHeight, jint format, jfloat rate)
Jan 3, 2019
Jan 3, 2019
581
SDL_LockMutex(Android_ActivityMutex);
Jan 3, 2019
Jan 3, 2019
582
Jan 3, 2019
Jan 3, 2019
583
Android_SetScreenResolution(Android_Window, surfaceWidth, surfaceHeight, deviceWidth, deviceHeight, format, rate);
Jan 3, 2019
Jan 3, 2019
584
Jan 3, 2019
Jan 3, 2019
585
SDL_UnlockMutex(Android_ActivityMutex);
Aug 23, 2018
Aug 23, 2018
588
589
590
591
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeOrientationChanged)(
JNIEnv *env, jclass jcls,
jint orientation)
{
Jan 9, 2019
Jan 9, 2019
592
593
594
595
596
SDL_VideoDevice *_this = SDL_GetVideoDevice();
if (_this) {
SDL_VideoDisplay *display = SDL_GetDisplay(0);
SDL_SendDisplayEvent(display, SDL_DISPLAYEVENT_ORIENTATION, orientation);
}
Aug 23, 2018
Aug 23, 2018
597
598
}
Sep 22, 2017
Sep 22, 2017
600
JNIEXPORT jint JNICALL SDL_JAVA_CONTROLLER_INTERFACE(onNativePadDown)(
Jan 3, 2019
Jan 3, 2019
601
JNIEnv *env, jclass jcls,
602
603
604
605
606
607
jint device_id, jint keycode)
{
return Android_OnPadDown(device_id, keycode);
}
/* Padup */
Sep 22, 2017
Sep 22, 2017
608
JNIEXPORT jint JNICALL SDL_JAVA_CONTROLLER_INTERFACE(onNativePadUp)(
Jan 3, 2019
Jan 3, 2019
609
JNIEnv *env, jclass jcls,
Dec 2, 2016
Dec 2, 2016
610
jint device_id, jint keycode)
611
612
613
614
615
{
return Android_OnPadUp(device_id, keycode);
}
/* Joy */
Sep 22, 2017
Sep 22, 2017
616
JNIEXPORT void JNICALL SDL_JAVA_CONTROLLER_INTERFACE(onNativeJoy)(
Jan 3, 2019
Jan 3, 2019
617
JNIEnv *env, jclass jcls,
618
619
620
621
622
623
jint device_id, jint axis, jfloat value)
{
Android_OnJoy(device_id, axis, value);
}
/* POV Hat */
Sep 22, 2017
Sep 22, 2017
624
JNIEXPORT void JNICALL SDL_JAVA_CONTROLLER_INTERFACE(onNativeHat)(
Jan 3, 2019
Jan 3, 2019
625
JNIEnv *env, jclass jcls,
626
627
628
629
630
631
jint device_id, jint hat_id, jint x, jint y)
{
Android_OnHat(device_id, hat_id, x, y);
}
Sep 22, 2017
Sep 22, 2017
632
JNIEXPORT jint JNICALL SDL_JAVA_CONTROLLER_INTERFACE(nativeAddJoystick)(
Jan 3, 2019
Jan 3, 2019
633
JNIEnv *env, jclass jcls,
Mar 6, 2018
Mar 6, 2018
634
635
636
jint device_id, jstring device_name, jstring device_desc,
jint vendor_id, jint product_id, jboolean is_accelerometer,
jint button_mask, jint naxes, jint nhats, jint nballs)
637
638
639
{
int retval;
const char *name = (*env)->GetStringUTFChars(env, device_name, NULL);
Aug 28, 2017
Aug 28, 2017
640
const char *desc = (*env)->GetStringUTFChars(env, device_desc, NULL);
Mar 6, 2018
Mar 6, 2018
642
retval = Android_AddJoystick(device_id, name, desc, vendor_id, product_id, is_accelerometer ? SDL_TRUE : SDL_FALSE, button_mask, naxes, nhats, nballs);
643
644
(*env)->ReleaseStringUTFChars(env, device_name, name);
Aug 28, 2017
Aug 28, 2017
645
(*env)->ReleaseStringUTFChars(env, device_desc, desc);
Aug 14, 2017
Aug 14, 2017
646
647
648
649
return retval;
}
Sep 22, 2017
Sep 22, 2017
650
JNIEXPORT jint JNICALL SDL_JAVA_CONTROLLER_INTERFACE(nativeRemoveJoystick)(
Jan 3, 2019
Jan 3, 2019
651
JNIEnv *env, jclass jcls,
Dec 2, 2016
Dec 2, 2016
652
jint device_id)
653
654
655
656
{
return Android_RemoveJoystick(device_id);
}
Sep 22, 2017
Sep 22, 2017
657
JNIEXPORT jint JNICALL SDL_JAVA_CONTROLLER_INTERFACE(nativeAddHaptic)(
Jan 3, 2019
Jan 3, 2019
658
JNIEnv *env, jclass jcls, jint device_id, jstring device_name)
Aug 12, 2017
Aug 12, 2017
659
660
661
662
663
664
665
666
667
668
669
{
int retval;
const char *name = (*env)->GetStringUTFChars(env, device_name, NULL);
retval = Android_AddHaptic(device_id, name);
(*env)->ReleaseStringUTFChars(env, device_name, name);
return retval;
}
Sep 22, 2017
Sep 22, 2017
670
JNIEXPORT jint JNICALL SDL_JAVA_CONTROLLER_INTERFACE(nativeRemoveHaptic)(
Jan 3, 2019
Jan 3, 2019
671
JNIEnv *env, jclass jcls, jint device_id)
Aug 12, 2017
Aug 12, 2017
672
673
674
675
{
return Android_RemoveHaptic(device_id);
}
Jan 9, 2019
Jan 9, 2019
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
/* Called from surfaceCreated() */
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeSurfaceCreated)(JNIEnv *env, jclass jcls)
{
SDL_LockMutex(Android_ActivityMutex);
if (Android_Window && Android_Window->driverdata)
{
SDL_WindowData *data = (SDL_WindowData *) Android_Window->driverdata;
data->native_window = Android_JNI_GetNativeWindow();
if (data->native_window == NULL) {
SDL_SetError("Could not fetch native window from UI thread");
}
}
SDL_UnlockMutex(Android_ActivityMutex);
}
Jan 9, 2019
Jan 9, 2019
694
/* Called from surfaceChanged() */
Jan 3, 2019
Jan 3, 2019
695
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeSurfaceChanged)(JNIEnv *env, jclass jcls)
Jan 3, 2019
Jan 3, 2019
697
SDL_LockMutex(Android_ActivityMutex);
Jan 3, 2019
Jan 3, 2019
698
Jan 3, 2019
Jan 3, 2019
699
700
701
702
if (Android_Window && Android_Window->driverdata)
{
SDL_VideoDevice *_this = SDL_GetVideoDevice();
SDL_WindowData *data = (SDL_WindowData *) Android_Window->driverdata;
Jan 3, 2019
Jan 3, 2019
704
705
706
/* If the surface has been previously destroyed by onNativeSurfaceDestroyed, recreate it here */
if (data->egl_surface == EGL_NO_SURFACE) {
data->egl_surface = SDL_EGL_CreateSurface(_this, (NativeWindowType) data->native_window);
Aug 14, 2017
Aug 14, 2017
708
Jan 3, 2019
Jan 3, 2019
709
710
/* GL Context handling is done in the event loop because this function is run from the Java thread */
}
Jan 3, 2019
Jan 3, 2019
711
Jan 3, 2019
Jan 3, 2019
712
SDL_UnlockMutex(Android_ActivityMutex);
Jan 9, 2019
Jan 9, 2019
715
/* Called from surfaceDestroyed() */
Jan 3, 2019
Jan 3, 2019
716
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeSurfaceDestroyed)(JNIEnv *env, jclass jcls)
Jan 3, 2019
Jan 3, 2019
718
SDL_LockMutex(Android_ActivityMutex);
Jan 3, 2019
Jan 3, 2019
719
Jan 3, 2019
Jan 3, 2019
720
721
722
723
if (Android_Window && Android_Window->driverdata)
{
SDL_VideoDevice *_this = SDL_GetVideoDevice();
SDL_WindowData *data = (SDL_WindowData *) Android_Window->driverdata;
Aug 14, 2017
Aug 14, 2017
724
Jan 3, 2019
Jan 3, 2019
725
726
727
728
/* We have to clear the current context and destroy the egl surface here
* Otherwise there's BAD_NATIVE_WINDOW errors coming from eglCreateWindowSurface on resume
* Ref: http://stackoverflow.com/questions/8762589/eglcreatewindowsurface-on-ics-and-switching-from-2d-to-3d
*/
Aug 14, 2017
Aug 14, 2017
729
Jan 3, 2019
Jan 3, 2019
730
731
732
733
734
if (data->egl_surface != EGL_NO_SURFACE) {
SDL_EGL_MakeCurrent(_this, NULL, NULL);
SDL_EGL_DestroySurface(_this, data->egl_surface);
data->egl_surface = EGL_NO_SURFACE;
}
Aug 14, 2017
Aug 14, 2017
735
Jan 9, 2019
Jan 9, 2019
736
737
738
739
740
if (data->native_window) {
ANativeWindow_release(data->native_window);
}
data->native_window = NULL;
Jan 3, 2019
Jan 3, 2019
741
/* GL Context handling is done in the event loop because this function is run from the Java thread */
Jan 3, 2019
Jan 3, 2019
743
Jan 3, 2019
Jan 3, 2019
744
SDL_UnlockMutex(Android_ActivityMutex);
745
746
747
}
/* Keydown */
Dec 2, 2016
Dec 2, 2016
748
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeKeyDown)(
Jan 3, 2019
Jan 3, 2019
749
JNIEnv *env, jclass jcls,
Dec 2, 2016
Dec 2, 2016
750
jint keycode)
751
752
753
754
755
{
Android_OnKeyDown(keycode);
}
/* Keyup */
Dec 2, 2016
Dec 2, 2016
756
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeKeyUp)(
Jan 3, 2019
Jan 3, 2019
757
JNIEnv *env, jclass jcls,
Dec 2, 2016
Dec 2, 2016
758
jint keycode)
759
760
761
762
763
{
Android_OnKeyUp(keycode);
}
/* Keyboard Focus Lost */
Dec 2, 2016
Dec 2, 2016
764
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeKeyboardFocusLost)(
Jan 3, 2019
Jan 3, 2019
765
JNIEnv *env, jclass jcls)
766
767
768
769
770
771
772
{
/* Calling SDL_StopTextInput will take care of hiding the keyboard and cleaning up the DummyText widget */
SDL_StopTextInput();
}
/* Touch */
Dec 2, 2016
Dec 2, 2016
773
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeTouch)(
Jan 3, 2019
Jan 3, 2019
774
JNIEnv *env, jclass jcls,
775
776
777
jint touch_device_id_in, jint pointer_finger_id_in,
jint action, jfloat x, jfloat y, jfloat p)
{
Jan 3, 2019
Jan 3, 2019
778
SDL_LockMutex(Android_ActivityMutex);
Jan 3, 2019
Jan 3, 2019
779
Jan 3, 2019
Jan 3, 2019
780
Android_OnTouch(Android_Window, touch_device_id_in, pointer_finger_id_in, action, x, y, p);
Jan 3, 2019
Jan 3, 2019
781
Jan 3, 2019
Jan 3, 2019
782
SDL_UnlockMutex(Android_ActivityMutex);
Dec 2, 2016
Dec 2, 2016
786
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeMouse)(
Jan 3, 2019
Jan 3, 2019
787
JNIEnv *env, jclass jcls,
Jun 5, 2018
Jun 5, 2018
788
jint button, jint action, jfloat x, jfloat y, jboolean relative)
Jan 3, 2019
Jan 3, 2019
790
SDL_LockMutex(Android_ActivityMutex);
Jan 3, 2019
Jan 3, 2019
791
Jan 3, 2019
Jan 3, 2019
792
Android_OnMouse(Android_Window, button, action, x, y, relative);
Jan 3, 2019
Jan 3, 2019
793
Jan 3, 2019
Jan 3, 2019
794
SDL_UnlockMutex(Android_ActivityMutex);
795
796
797
}
/* Accelerometer */
Dec 2, 2016
Dec 2, 2016
798
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeAccel)(
Jan 3, 2019
Jan 3, 2019
799
JNIEnv *env, jclass jcls,
800
801
802
803
804
805
806
807
jfloat x, jfloat y, jfloat z)
{
fLastAccelerometer[0] = x;
fLastAccelerometer[1] = y;
fLastAccelerometer[2] = z;
bHasNewData = SDL_TRUE;
}
Aug 28, 2017
Aug 28, 2017
808
809
/* Clipboard */
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeClipboardChanged)(
Jan 3, 2019
Jan 3, 2019
810
JNIEnv *env, jclass jcls)
Aug 28, 2017
Aug 28, 2017
811
812
813
814
{
SDL_SendClipboardUpdate();
}
Dec 2, 2016
Dec 2, 2016
816
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativeLowMemory)(
Jan 3, 2019
Jan 3, 2019
817
JNIEnv *env, jclass cls)
818
819
820
821
{
SDL_SendAppEvent(SDL_APP_LOWMEMORY);
}
Jan 10, 2019
Jan 10, 2019
822
823
/* Send Quit event to "SDLThread" thread */
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativeSendQuit)(
Jan 3, 2019
Jan 3, 2019
824
JNIEnv *env, jclass cls)
825
826
{
/* Discard previous events. The user should have handled state storage
Jan 10, 2019
Jan 10, 2019
827
* in SDL_APP_WILLENTERBACKGROUND. After nativeSendQuit() is called, no
828
829
830
831
832
* events other than SDL_QUIT and SDL_APP_TERMINATING should fire */
SDL_FlushEvents(SDL_FIRSTEVENT, SDL_LASTEVENT);
/* Inject a SDL_QUIT event */
SDL_SendQuit();
SDL_SendAppEvent(SDL_APP_TERMINATING);
Jan 7, 2019
Jan 7, 2019
833
834
835
836
/* Robustness: clear any pending Pause */
while (SDL_SemTryWait(Android_PauseSem) == 0) {
/* empty */
}
837
838
/* Resume the event loop so that the app can catch SDL_QUIT which
* should now be the top event in the event queue. */
Jan 6, 2019
Jan 6, 2019
839
SDL_SemPost(Android_ResumeSem);
Jan 10, 2019
Jan 10, 2019
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
/* Activity ends */
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativeQuit)(
JNIEnv *env, jclass cls)
{
const char *str;
if (Android_ActivityMutex) {
SDL_DestroyMutex(Android_ActivityMutex);
Android_ActivityMutex = NULL;
}
str = SDL_GetError();
if (str && str[0]) {
__android_log_print(ANDROID_LOG_VERBOSE, "SDL", "SDLActivity thread ends (error=%s)", str);
} else {
__android_log_print(ANDROID_LOG_VERBOSE, "SDL", "SDLActivity thread ends");
}
}
Dec 2, 2016
Dec 2, 2016
862
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativePause)(
Jan 3, 2019
Jan 3, 2019
863
JNIEnv *env, jclass cls)
Jan 3, 2019
Jan 3, 2019
865
SDL_LockMutex(Android_ActivityMutex);
Jan 3, 2019
Jan 3, 2019
866
867
__android_log_print(ANDROID_LOG_VERBOSE, "SDL", "nativePause()");
Aug 28, 2017
Aug 28, 2017
868
869
870
871
872
873
if (Android_Window) {
SDL_SendWindowEvent(Android_Window, SDL_WINDOWEVENT_FOCUS_LOST, 0, 0);
SDL_SendWindowEvent(Android_Window, SDL_WINDOWEVENT_MINIMIZED, 0, 0);
SDL_SendAppEvent(SDL_APP_WILLENTERBACKGROUND);
SDL_SendAppEvent(SDL_APP_DIDENTERBACKGROUND);
Aug 14, 2017
Aug 14, 2017
874
875
/* *After* sending the relevant events, signal the pause semaphore
Jan 5, 2019
Jan 5, 2019
876
877
878
879
* so the event loop knows to pause and (optionally) block itself.
* Sometimes 2 pauses can be queued (eg pause/resume/pause), so it's
* always increased. */
SDL_SemPost(Android_PauseSem);
Jan 3, 2019
Jan 3, 2019
881
Jan 3, 2019
Jan 3, 2019
882
SDL_UnlockMutex(Android_ActivityMutex);
883
884
885
}
/* Resume */
Dec 2, 2016
Dec 2, 2016
886
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativeResume)(
Jan 3, 2019
Jan 3, 2019
887
JNIEnv *env, jclass cls)
Jan 3, 2019
Jan 3, 2019
889
SDL_LockMutex(Android_ActivityMutex);
Jan 3, 2019
Jan 3, 2019
890
891
892
893
894
895
896
897
898
899
900
901
__android_log_print(ANDROID_LOG_VERBOSE, "SDL", "nativeResume()");
if (Android_Window) {
SDL_SendAppEvent(SDL_APP_WILLENTERFOREGROUND);
SDL_SendAppEvent(SDL_APP_DIDENTERFOREGROUND);
SDL_SendWindowEvent(Android_Window, SDL_WINDOWEVENT_FOCUS_GAINED, 0, 0);
SDL_SendWindowEvent(Android_Window, SDL_WINDOWEVENT_RESTORED, 0, 0);
/* Signal the resume semaphore so the event loop knows to resume and restore the GL Context
* We can't restore the GL Context here because it needs to be done on the SDL main thread
* and this function will be called from the Java thread instead.
*/
Jan 6, 2019
Jan 6, 2019
902
SDL_SemPost(Android_ResumeSem);
Jan 3, 2019
Jan 3, 2019
904
Jan 3, 2019
Jan 3, 2019
905
SDL_UnlockMutex(Android_ActivityMutex);
Dec 2, 2016
Dec 2, 2016
908
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE_INPUT_CONNECTION(nativeCommitText)(
Jan 3, 2019
Jan 3, 2019
909
JNIEnv *env, jclass cls,
910
911
912
913
914
915
916
917
918
jstring text, jint newCursorPosition)
{
const char *utftext = (*env)->GetStringUTFChars(env, text, NULL);
SDL_SendKeyboardText(utftext);
(*env)->ReleaseStringUTFChars(env, text, utftext);
}
Oct 26, 2017
Oct 26, 2017
919
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE_INPUT_CONNECTION(nativeGenerateScancodeForUnichar)(
Jan 3, 2019
Jan 3, 2019
920
JNIEnv *env, jclass cls,
Oct 26, 2017
Oct 26, 2017
921
922
923
924
925
jchar chUnicode)
{
SDL_Scancode code = SDL_SCANCODE_UNKNOWN;
uint16_t mod = 0;
Dec 30, 2018
Dec 30, 2018
926
/* We do not care about bigger than 127. */
Oct 26, 2017
Oct 26, 2017
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
if (chUnicode < 127) {
AndroidKeyInfo info = unicharToAndroidKeyInfoTable[chUnicode];
code = info.code;
mod = info.mod;
}
if (mod & KMOD_SHIFT) {
/* If character uses shift, press shift down */
SDL_SendKeyboardKey(SDL_PRESSED, SDL_SCANCODE_LSHIFT);
}
/* send a keydown and keyup even for the character */
SDL_SendKeyboardKey(SDL_PRESSED, code);
SDL_SendKeyboardKey(SDL_RELEASED, code);
if (mod & KMOD_SHIFT) {
/* If character uses shift, press shift back up */
SDL_SendKeyboardKey(SDL_RELEASED, SDL_SCANCODE_LSHIFT);
}
}
Dec 2, 2016
Dec 2, 2016
949
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE_INPUT_CONNECTION(nativeSetComposingText)(
Jan 3, 2019
Jan 3, 2019
950
JNIEnv *env, jclass cls,
951
952
953
954
955
956
957
958
959
jstring text, jint newCursorPosition)
{
const char *utftext = (*env)->GetStringUTFChars(env, text, NULL);
SDL_SendEditingText(utftext, 0, 0);
(*env)->ReleaseStringUTFChars(env, text, utftext);
}
Dec 2, 2016
Dec 2, 2016
960
JNIEXPORT jstring JNICALL SDL_JAVA_INTERFACE(nativeGetHint)(
Jan 3, 2019
Jan 3, 2019
961
JNIEnv *env, jclass cls,
Dec 2, 2016
Dec 2, 2016
962
963
jstring name)
{
964
965
966
967
968
969
970
971
972
const char *utfname = (*env)->GetStringUTFChars(env, name, NULL);
const char *hint = SDL_GetHint(utfname);
jstring result = (*env)->NewStringUTF(env, hint);
(*env)->ReleaseStringUTFChars(env, name, utfname);
return result;
}
Nov 4, 2017
Nov 4, 2017
973
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativeSetenv)(
Jan 3, 2019
Jan 3, 2019
974
JNIEnv *env, jclass cls,
Nov 4, 2017
Nov 4, 2017
975
976
977
978
979
980
981
982
983
984
985
986
jstring name, jstring value)
{
const char *utfname = (*env)->GetStringUTFChars(env, name, NULL);
const char *utfvalue = (*env)->GetStringUTFChars(env, value, NULL);
SDL_setenv(utfname, utfvalue, 1);
(*env)->ReleaseStringUTFChars(env, name, utfname);
(*env)->ReleaseStringUTFChars(env, value, utfvalue);
}
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
/*******************************************************************************
Functions called by SDL into Java
*******************************************************************************/
static int s_active = 0;
struct LocalReferenceHolder
{
JNIEnv *m_env;
const char *m_func;
};
static struct LocalReferenceHolder LocalReferenceHolder_Setup(const char *func)
{
struct LocalReferenceHolder refholder;