Skip to content

Latest commit

 

History

History
2801 lines (2334 loc) · 101 KB

SDL_android.c

File metadata and controls

2801 lines (2334 loc) · 101 KB
 
1
2
/*
Simple DirectMedia Layer
Jan 17, 2020
Jan 17, 2020
3
Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org>
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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"
Apr 7, 2020
Apr 7, 2020
22
23
24
#include "SDL_stdinc.h"
#include "SDL_assert.h"
Feb 13, 2020
Feb 13, 2020
25
#include "SDL_atomic.h"
26
#include "SDL_hints.h"
Aug 28, 2017
Aug 28, 2017
27
#include "SDL_main.h"
Jun 28, 2019
Jun 28, 2019
28
#include "SDL_timer.h"
29
30
31
32
33
34
#ifdef __ANDROID__
#include "SDL_system.h"
#include "SDL_android.h"
Oct 26, 2017
Oct 26, 2017
35
36
#include "keyinfotable.h"
37
38
39
40
41
42
43
#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
44
#include "../../haptic/android/SDL_syshaptic_c.h"
45
46
#include <android/log.h>
May 23, 2019
May 23, 2019
47
#include <sys/system_properties.h>
48
49
50
#include <pthread.h>
#include <sys/types.h>
#include <unistd.h>
Aug 28, 2017
Aug 28, 2017
51
#include <dlfcn.h>
Dec 2, 2016
Dec 2, 2016
52
53
54
55
56
#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
57
58
#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
59
60
#define SDL_JAVA_INTERFACE_INPUT_CONNECTION(function) CONCAT1(SDL_JAVA_PREFIX, SDLInputConnection, function)
Oct 10, 2018
Oct 10, 2018
61
62
63
64
/* Audio encoding definitions */
#define ENCODING_PCM_8BIT 3
#define ENCODING_PCM_16BIT 2
#define ENCODING_PCM_FLOAT 4
Dec 2, 2016
Dec 2, 2016
65
66
/* Java class SDLActivity */
Aug 28, 2017
Aug 28, 2017
67
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativeSetupJNI)(
Jan 11, 2019
Jan 11, 2019
68
JNIEnv *env, jclass cls);
Aug 28, 2017
Aug 28, 2017
69
70
JNIEXPORT int JNICALL SDL_JAVA_INTERFACE(nativeRunMain)(
Jan 3, 2019
Jan 3, 2019
71
JNIEnv *env, jclass cls,
Aug 28, 2017
Aug 28, 2017
72
73
jstring library, jstring function, jobject array);
Dec 2, 2016
Dec 2, 2016
74
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeDropFile)(
Jan 3, 2019
Jan 3, 2019
75
JNIEnv *env, jclass jcls,
Dec 2, 2016
Dec 2, 2016
76
77
jstring filename);
Jan 17, 2019
Jan 17, 2019
78
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativeSetScreenResolution)(
Jan 3, 2019
Jan 3, 2019
79
JNIEnv *env, jclass jcls,
Jun 8, 2018
Jun 8, 2018
80
jint surfaceWidth, jint surfaceHeight,
Sep 24, 2018
Sep 24, 2018
81
jint deviceWidth, jint deviceHeight, jint format, jfloat rate);
Dec 2, 2016
Dec 2, 2016
82
Jan 17, 2019
Jan 17, 2019
83
84
85
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeResize)(
JNIEnv *env, jclass cls);
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
jint keycode);
May 23, 2019
May 23, 2019
103
104
105
JNIEXPORT jboolean JNICALL SDL_JAVA_INTERFACE(onNativeSoftReturnKey)(
JNIEnv *env, jclass jcls);
Dec 2, 2016
Dec 2, 2016
106
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeKeyboardFocusLost)(
Jan 3, 2019
Jan 3, 2019
107
JNIEnv *env, jclass jcls);
Dec 2, 2016
Dec 2, 2016
108
109
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeTouch)(
Jan 3, 2019
Jan 3, 2019
110
JNIEnv *env, jclass jcls,
Dec 2, 2016
Dec 2, 2016
111
112
113
114
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
115
JNIEnv *env, jclass jcls,
Jun 5, 2018
Jun 5, 2018
116
jint button, jint action, jfloat x, jfloat y, jboolean relative);
Dec 2, 2016
Dec 2, 2016
117
118
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeAccel)(
Jan 3, 2019
Jan 3, 2019
119
JNIEnv *env, jclass jcls,
Dec 2, 2016
Dec 2, 2016
120
121
jfloat x, jfloat y, jfloat z);
Aug 28, 2017
Aug 28, 2017
122
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeClipboardChanged)(
Jan 3, 2019
Jan 3, 2019
123
JNIEnv *env, jclass jcls);
Aug 28, 2017
Aug 28, 2017
124
Dec 2, 2016
Dec 2, 2016
125
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativeLowMemory)(
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
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativeSendQuit)(
Jan 3, 2019
Jan 3, 2019
129
JNIEnv *env, jclass cls);
Dec 2, 2016
Dec 2, 2016
130
Jan 10, 2019
Jan 10, 2019
131
132
133
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativeQuit)(
JNIEnv *env, jclass cls);
Dec 2, 2016
Dec 2, 2016
134
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativePause)(
Jan 3, 2019
Jan 3, 2019
135
JNIEnv *env, jclass cls);
Dec 2, 2016
Dec 2, 2016
136
137
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativeResume)(
Jan 3, 2019
Jan 3, 2019
138
JNIEnv *env, jclass cls);
Dec 2, 2016
Dec 2, 2016
139
Apr 22, 2019
Apr 22, 2019
140
141
142
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativeFocusChanged)(
JNIEnv *env, jclass cls, jboolean hasFocus);
Dec 2, 2016
Dec 2, 2016
143
JNIEXPORT jstring JNICALL SDL_JAVA_INTERFACE(nativeGetHint)(
Jan 3, 2019
Jan 3, 2019
144
JNIEnv *env, jclass cls,
Dec 2, 2016
Dec 2, 2016
145
146
jstring name);
Nov 4, 2017
Nov 4, 2017
147
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativeSetenv)(
Jan 3, 2019
Jan 3, 2019
148
JNIEnv *env, jclass cls,
Nov 4, 2017
Nov 4, 2017
149
150
jstring name, jstring value);
Aug 23, 2018
Aug 23, 2018
151
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeOrientationChanged)(
Jan 3, 2019
Jan 3, 2019
152
JNIEnv *env, jclass cls,
Aug 23, 2018
Aug 23, 2018
153
154
jint orientation);
Jan 10, 2019
Jan 10, 2019
155
156
157
158
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativeAddTouch)(
JNIEnv* env, jclass cls,
jint touchId, jstring name);
Feb 13, 2020
Feb 13, 2020
159
160
161
162
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativePermissionResult)(
JNIEnv* env, jclass cls,
jint requestCode, jboolean result);
Dec 12, 2019
Dec 12, 2019
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
static JNINativeMethod SDLActivity_tab[] = {
{ "nativeSetupJNI", "()I", SDL_JAVA_INTERFACE(nativeSetupJNI) },
{ "nativeRunMain", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;)I", SDL_JAVA_INTERFACE(nativeRunMain) },
{ "onNativeDropFile", "(Ljava/lang/String;)V", SDL_JAVA_INTERFACE(onNativeDropFile) },
{ "nativeSetScreenResolution", "(IIIIIF)V", SDL_JAVA_INTERFACE(nativeSetScreenResolution) },
{ "onNativeResize", "()V", SDL_JAVA_INTERFACE(onNativeResize) },
{ "onNativeSurfaceCreated", "()V", SDL_JAVA_INTERFACE(onNativeSurfaceCreated) },
{ "onNativeSurfaceChanged", "()V", SDL_JAVA_INTERFACE(onNativeSurfaceChanged) },
{ "onNativeSurfaceDestroyed", "()V", SDL_JAVA_INTERFACE(onNativeSurfaceDestroyed) },
{ "onNativeKeyDown", "(I)V", SDL_JAVA_INTERFACE(onNativeKeyDown) },
{ "onNativeKeyUp", "(I)V", SDL_JAVA_INTERFACE(onNativeKeyUp) },
{ "onNativeSoftReturnKey", "()Z", SDL_JAVA_INTERFACE(onNativeSoftReturnKey) },
{ "onNativeKeyboardFocusLost", "()V", SDL_JAVA_INTERFACE(onNativeKeyboardFocusLost) },
{ "onNativeTouch", "(IIIFFF)V", SDL_JAVA_INTERFACE(onNativeTouch) },
{ "onNativeMouse", "(IIFFZ)V", SDL_JAVA_INTERFACE(onNativeMouse) },
{ "onNativeAccel", "(FFF)V", SDL_JAVA_INTERFACE(onNativeAccel) },
{ "onNativeClipboardChanged", "()V", SDL_JAVA_INTERFACE(onNativeClipboardChanged) },
{ "nativeLowMemory", "()V", SDL_JAVA_INTERFACE(nativeLowMemory) },
{ "nativeSendQuit", "()V", SDL_JAVA_INTERFACE(nativeSendQuit) },
{ "nativeQuit", "()V", SDL_JAVA_INTERFACE(nativeQuit) },
{ "nativePause", "()V", SDL_JAVA_INTERFACE(nativePause) },
{ "nativeResume", "()V", SDL_JAVA_INTERFACE(nativeResume) },
{ "nativeFocusChanged", "(Z)V", SDL_JAVA_INTERFACE(nativeFocusChanged) },
{ "nativeGetHint", "(Ljava/lang/String;)Ljava/lang/String;", SDL_JAVA_INTERFACE(nativeGetHint) },
{ "nativeSetenv", "(Ljava/lang/String;Ljava/lang/String;)V", SDL_JAVA_INTERFACE(nativeSetenv) },
{ "onNativeOrientationChanged", "(I)V", SDL_JAVA_INTERFACE(onNativeOrientationChanged) },
Feb 13, 2020
Feb 13, 2020
189
190
{ "nativeAddTouch", "(ILjava/lang/String;)V", SDL_JAVA_INTERFACE(nativeAddTouch) },
{ "nativePermissionResult", "(IZ)V", SDL_JAVA_INTERFACE(nativePermissionResult) }
Dec 12, 2019
Dec 12, 2019
191
192
};
Dec 2, 2016
Dec 2, 2016
193
194
/* Java class SDLInputConnection */
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE_INPUT_CONNECTION(nativeCommitText)(
Jan 3, 2019
Jan 3, 2019
195
JNIEnv *env, jclass cls,
Dec 2, 2016
Dec 2, 2016
196
197
jstring text, jint newCursorPosition);
Sep 27, 2018
Sep 27, 2018
198
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE_INPUT_CONNECTION(nativeGenerateScancodeForUnichar)(
Jan 3, 2019
Jan 3, 2019
199
JNIEnv *env, jclass cls,
Sep 27, 2018
Sep 27, 2018
200
201
jchar chUnicode);
Dec 2, 2016
Dec 2, 2016
202
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE_INPUT_CONNECTION(nativeSetComposingText)(
Jan 3, 2019
Jan 3, 2019
203
JNIEnv *env, jclass cls,
Dec 2, 2016
Dec 2, 2016
204
205
jstring text, jint newCursorPosition);
Dec 12, 2019
Dec 12, 2019
206
207
208
209
210
211
static JNINativeMethod SDLInputConnection_tab[] = {
{ "nativeCommitText", "(Ljava/lang/String;I)V", SDL_JAVA_INTERFACE_INPUT_CONNECTION(nativeCommitText) },
{ "nativeGenerateScancodeForUnichar", "(C)V", SDL_JAVA_INTERFACE_INPUT_CONNECTION(nativeGenerateScancodeForUnichar) },
{ "nativeSetComposingText", "(Ljava/lang/String;I)V", SDL_JAVA_INTERFACE_INPUT_CONNECTION(nativeSetComposingText) }
};
Sep 22, 2017
Sep 22, 2017
212
213
214
215
/* Java class SDLAudioManager */
JNIEXPORT void JNICALL SDL_JAVA_AUDIO_INTERFACE(nativeSetupJNI)(
JNIEnv *env, jclass jcls);
Dec 12, 2019
Dec 12, 2019
216
217
218
219
static JNINativeMethod SDLAudioManager_tab[] = {
{ "nativeSetupJNI", "()I", SDL_JAVA_AUDIO_INTERFACE(nativeSetupJNI) }
};
Sep 22, 2017
Sep 22, 2017
220
221
222
223
224
/* 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
225
JNIEnv *env, jclass jcls,
Sep 22, 2017
Sep 22, 2017
226
227
228
jint device_id, jint keycode);
JNIEXPORT jint JNICALL SDL_JAVA_CONTROLLER_INTERFACE(onNativePadUp)(
Jan 3, 2019
Jan 3, 2019
229
JNIEnv *env, jclass jcls,
Sep 22, 2017
Sep 22, 2017
230
231
232
jint device_id, jint keycode);
JNIEXPORT void JNICALL SDL_JAVA_CONTROLLER_INTERFACE(onNativeJoy)(
Jan 3, 2019
Jan 3, 2019
233
JNIEnv *env, jclass jcls,
Sep 22, 2017
Sep 22, 2017
234
235
236
jint device_id, jint axis, jfloat value);
JNIEXPORT void JNICALL SDL_JAVA_CONTROLLER_INTERFACE(onNativeHat)(
Jan 3, 2019
Jan 3, 2019
237
JNIEnv *env, jclass jcls,
Sep 22, 2017
Sep 22, 2017
238
239
240
jint device_id, jint hat_id, jint x, jint y);
JNIEXPORT jint JNICALL SDL_JAVA_CONTROLLER_INTERFACE(nativeAddJoystick)(
Jan 3, 2019
Jan 3, 2019
241
JNIEnv *env, jclass jcls,
Mar 6, 2018
Mar 6, 2018
242
243
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
244
245
JNIEXPORT jint JNICALL SDL_JAVA_CONTROLLER_INTERFACE(nativeRemoveJoystick)(
Jan 3, 2019
Jan 3, 2019
246
JNIEnv *env, jclass jcls,
Sep 22, 2017
Sep 22, 2017
247
248
249
jint device_id);
JNIEXPORT jint JNICALL SDL_JAVA_CONTROLLER_INTERFACE(nativeAddHaptic)(
Jan 3, 2019
Jan 3, 2019
250
JNIEnv *env, jclass jcls,
Sep 22, 2017
Sep 22, 2017
251
252
253
jint device_id, jstring device_name);
JNIEXPORT jint JNICALL SDL_JAVA_CONTROLLER_INTERFACE(nativeRemoveHaptic)(
Jan 3, 2019
Jan 3, 2019
254
JNIEnv *env, jclass jcls,
Sep 22, 2017
Sep 22, 2017
255
256
jint device_id);
Dec 12, 2019
Dec 12, 2019
257
258
259
260
261
262
263
264
265
266
267
static JNINativeMethod SDLControllerManager_tab[] = {
{ "nativeSetupJNI", "()I", SDL_JAVA_CONTROLLER_INTERFACE(nativeSetupJNI) },
{ "onNativePadDown", "(II)I", SDL_JAVA_CONTROLLER_INTERFACE(onNativePadDown) },
{ "onNativePadUp", "(II)I", SDL_JAVA_CONTROLLER_INTERFACE(onNativePadUp) },
{ "onNativeJoy", "(IIF)V", SDL_JAVA_CONTROLLER_INTERFACE(onNativeJoy) },
{ "onNativeHat", "(IIII)V", SDL_JAVA_CONTROLLER_INTERFACE(onNativeHat) },
{ "nativeAddJoystick", "(ILjava/lang/String;Ljava/lang/String;IIZIIII)I", SDL_JAVA_CONTROLLER_INTERFACE(nativeAddJoystick) },
{ "nativeRemoveJoystick", "(I)I", SDL_JAVA_CONTROLLER_INTERFACE(nativeRemoveJoystick) },
{ "nativeAddHaptic", "(ILjava/lang/String;)I", SDL_JAVA_CONTROLLER_INTERFACE(nativeAddHaptic) },
{ "nativeRemoveHaptic", "(I)I", SDL_JAVA_CONTROLLER_INTERFACE(nativeRemoveHaptic) }
};
Sep 22, 2017
Sep 22, 2017
268
Dec 2, 2016
Dec 2, 2016
269
270
271
272
/* Uncomment this to log messages entering and exiting methods in this file */
/* #define DEBUG_JNI */
Sep 27, 2018
Sep 27, 2018
273
static void checkJNIReady(void);
274
275
276
277
278
279
280
281
282
283
284
/*******************************************************************************
This file links the Java side of Android with libsdl
*******************************************************************************/
#include <jni.h>
/*******************************************************************************
Globals
*******************************************************************************/
static pthread_key_t mThreadKey;
Jan 11, 2019
Jan 11, 2019
285
286
static pthread_once_t key_once = PTHREAD_ONCE_INIT;
static JavaVM *mJavaVM = NULL;
287
288
289
290
291
/* Main activity */
static jclass mActivityClass;
/* method signatures */
Feb 13, 2020
Feb 13, 2020
292
293
294
295
static jmethodID midClipboardGetText;
static jmethodID midClipboardHasText;
static jmethodID midClipboardSetText;
static jmethodID midCreateCustomCursor;
Aug 14, 2017
Aug 14, 2017
296
static jmethodID midGetContext;
Feb 13, 2020
Feb 13, 2020
297
298
299
300
static jmethodID midGetDisplayDPI;
static jmethodID midGetManifestEnvironmentVariables;
static jmethodID midGetNativeSurface;
static jmethodID midInitTouch;
Feb 6, 2018
Feb 6, 2018
301
static jmethodID midIsAndroidTV;
Jun 5, 2018
Jun 5, 2018
302
static jmethodID midIsChromebook;
Jun 18, 2018
Jun 18, 2018
303
static jmethodID midIsDeXMode;
Aug 14, 2017
Aug 14, 2017
304
static jmethodID midIsScreenKeyboardShown;
Feb 13, 2020
Feb 13, 2020
305
306
307
static jmethodID midIsTablet;
static jmethodID midManualBackButton;
static jmethodID midMinimizeWindow;
Sep 22, 2017
Sep 22, 2017
308
static jmethodID midOpenAPKExpansionInputStream;
Feb 13, 2020
Feb 13, 2020
309
310
311
static jmethodID midRequestPermission;
static jmethodID midSendMessage;
static jmethodID midSetActivityTitle;
Mar 16, 2018
Mar 16, 2018
312
static jmethodID midSetCustomCursor;
Feb 13, 2020
Feb 13, 2020
313
314
315
static jmethodID midSetOrientation;
static jmethodID midSetRelativeMouseEnabled;
static jmethodID midSetSurfaceViewFormat;
Mar 16, 2018
Mar 16, 2018
316
static jmethodID midSetSystemCursor;
Feb 13, 2020
Feb 13, 2020
317
318
319
static jmethodID midSetWindowStyle;
static jmethodID midShouldMinimizeOnFocusLoss;
static jmethodID midShowTextInput;
Jun 5, 2018
Jun 5, 2018
320
static jmethodID midSupportsRelativeMouse;
Aug 28, 2017
Aug 28, 2017
321
Sep 22, 2017
Sep 22, 2017
322
323
324
325
326
327
/* audio manager */
static jclass mAudioManagerClass;
/* method signatures */
static jmethodID midAudioOpen;
static jmethodID midAudioWriteByteBuffer;
Oct 10, 2018
Oct 10, 2018
328
329
static jmethodID midAudioWriteShortBuffer;
static jmethodID midAudioWriteFloatBuffer;
Sep 22, 2017
Sep 22, 2017
330
331
332
static jmethodID midAudioClose;
static jmethodID midCaptureOpen;
static jmethodID midCaptureReadByteBuffer;
Oct 10, 2018
Oct 10, 2018
333
334
static jmethodID midCaptureReadShortBuffer;
static jmethodID midCaptureReadFloatBuffer;
Sep 22, 2017
Sep 22, 2017
335
static jmethodID midCaptureClose;
Jan 10, 2019
Jan 10, 2019
336
static jmethodID midAudioSetThreadPriority;
Sep 22, 2017
Sep 22, 2017
337
338
339
340
341
342
343
344
/* controller manager */
static jclass mControllerManagerClass;
/* method signatures */
static jmethodID midPollInputDevices;
static jmethodID midPollHapticDevices;
static jmethodID midHapticRun;
Aug 24, 2018
Aug 24, 2018
345
static jmethodID midHapticStop;
346
347
/* Accelerometer data storage */
Mar 12, 2019
Mar 12, 2019
348
static SDL_DisplayOrientation displayOrientation;
349
350
351
static float fLastAccelerometer[3];
static SDL_bool bHasNewData;
Feb 13, 2020
Feb 13, 2020
352
353
354
355
static SDL_bool bHasEnvironmentVariables;
static SDL_atomic_t bPermissionRequestPending;
static SDL_bool bPermissionRequestResult;
Nov 4, 2017
Nov 4, 2017
356
357
358
359
360
/*******************************************************************************
Functions called by JNI
*******************************************************************************/
Jan 11, 2019
Jan 11, 2019
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
/* From http://developer.android.com/guide/practices/jni.html
* All threads are Linux threads, scheduled by the kernel.
* They're usually started from managed code (using Thread.start), but they can also be created elsewhere and then
* attached to the JavaVM. For example, a thread started with pthread_create can be attached with the
* JNI AttachCurrentThread or AttachCurrentThreadAsDaemon functions. Until a thread is attached, it has no JNIEnv,
* and cannot make JNI calls.
* Attaching a natively-created thread causes a java.lang.Thread object to be constructed and added to the "main"
* ThreadGroup, making it visible to the debugger. Calling AttachCurrentThread on an already-attached thread
* is a no-op.
* Note: You can call this function any number of times for the same thread, there's no harm in it
*/
/* From http://developer.android.com/guide/practices/jni.html
* Threads attached through JNI must call DetachCurrentThread before they exit. If coding this directly is awkward,
* in Android 2.0 (Eclair) and higher you can use pthread_key_create to define a destructor function that will be
* called before the thread exits, and call DetachCurrentThread from there. (Use that key with pthread_setspecific
* to store the JNIEnv in thread-local-storage; that way it'll be passed into your destructor as the argument.)
* Note: The destructor is not called unless the stored value is != NULL
* Note: You can call this function any number of times for the same thread, there's no harm in it
* (except for some lost CPU cycles)
*/
/* Set local storage value */
static int
Android_JNI_SetEnv(JNIEnv *env) {
int status = pthread_setspecific(mThreadKey, env);
if (status < 0) {
__android_log_print(ANDROID_LOG_ERROR, "SDL", "Failed pthread_setspecific() in Android_JNI_SetEnv() (err=%d)", status);
}
return status;
}
/* Get local storage value */
JNIEnv* Android_JNI_GetEnv(void)
{
/* Get JNIEnv from the Thread local storage */
JNIEnv *env = pthread_getspecific(mThreadKey);
if (env == NULL) {
Jan 20, 2019
Jan 20, 2019
399
/* If it fails, try to attach ! (e.g the thread isn't created with SDL_CreateThread() */
Jan 20, 2019
Jan 20, 2019
400
401
402
403
404
int status;
/* There should be a JVM */
if (mJavaVM == NULL) {
__android_log_print(ANDROID_LOG_ERROR, "SDL", "Failed, there is no JavaVM");
Jan 20, 2019
Jan 20, 2019
405
return NULL;
Jan 20, 2019
Jan 20, 2019
406
407
408
409
410
411
412
413
414
415
416
417
418
419
}
/* Attach the current thread to the JVM and get a JNIEnv.
* It will be detached by pthread_create destructor 'Android_JNI_ThreadDestroyed' */
status = (*mJavaVM)->AttachCurrentThread(mJavaVM, &env, NULL);
if (status < 0) {
__android_log_print(ANDROID_LOG_ERROR, "SDL", "Failed to attach current thread (err=%d)", status);
return NULL;
}
/* Save JNIEnv into the Thread local storage */
if (Android_JNI_SetEnv(env) < 0) {
return NULL;
}
Jan 11, 2019
Jan 11, 2019
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
}
return env;
}
/* Set up an external thread for using JNI with Android_JNI_GetEnv() */
int Android_JNI_SetupThread(void)
{
JNIEnv *env;
int status;
/* There should be a JVM */
if (mJavaVM == NULL) {
__android_log_print(ANDROID_LOG_ERROR, "SDL", "Failed, there is no JavaVM");
return 0;
}
/* Attach the current thread to the JVM and get a JNIEnv.
* It will be detached by pthread_create destructor 'Android_JNI_ThreadDestroyed' */
status = (*mJavaVM)->AttachCurrentThread(mJavaVM, &env, NULL);
if (status < 0) {
__android_log_print(ANDROID_LOG_ERROR, "SDL", "Failed to attach current thread (err=%d)", status);
return 0;
}
/* Save JNIEnv into the Thread local storage */
if (Android_JNI_SetEnv(env) < 0) {
return 0;
}
return 1;
}
/* Destructor called for each thread where mThreadKey is not NULL */
static void
Android_JNI_ThreadDestroyed(void *value)
{
/* The thread is being destroyed, detach it from the Java VM and set the mThreadKey value to NULL as required */
JNIEnv *env = (JNIEnv *) value;
if (env != NULL) {
(*mJavaVM)->DetachCurrentThread(mJavaVM);
Android_JNI_SetEnv(NULL);
}
}
/* Creation of local storage mThreadKey */
Jan 11, 2019
Jan 11, 2019
466
static void
Mar 12, 2019
Mar 12, 2019
467
Android_JNI_CreateKey(void)
Jan 11, 2019
Jan 11, 2019
468
469
470
471
472
473
474
{
int status = pthread_key_create(&mThreadKey, Android_JNI_ThreadDestroyed);
if (status < 0) {
__android_log_print(ANDROID_LOG_ERROR, "SDL", "Error initializing mThreadKey with pthread_key_create() (err=%d)", status);
}
}
Jan 11, 2019
Jan 11, 2019
475
static void
Mar 12, 2019
Mar 12, 2019
476
Android_JNI_CreateKey_once(void)
Jan 11, 2019
Jan 11, 2019
477
478
479
480
481
482
483
{
int status = pthread_once(&key_once, Android_JNI_CreateKey);
if (status < 0) {
__android_log_print(ANDROID_LOG_ERROR, "SDL", "Error initializing mThreadKey with pthread_once() (err=%d)", status);
}
}
Dec 12, 2019
Dec 12, 2019
484
static void
Jan 17, 2020
Jan 17, 2020
485
register_methods(JNIEnv *env, const char *classname, JNINativeMethod *methods, int nb)
Dec 12, 2019
Dec 12, 2019
486
487
488
489
490
491
492
493
{
jclass clazz = (*env)->FindClass(env, classname);
if (clazz == NULL || (*env)->RegisterNatives(env, clazz, methods, nb) < 0) {
__android_log_print(ANDROID_LOG_ERROR, "SDL", "Failed to register methods of %s", classname);
return;
}
}
Jan 3, 2019
Jan 3, 2019
495
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved)
Dec 12, 2019
Dec 12, 2019
498
499
500
501
502
503
504
JNIEnv *env = NULL;
if ((*mJavaVM)->GetEnv(mJavaVM, (void **)&env, JNI_VERSION_1_4) != JNI_OK) {
__android_log_print(ANDROID_LOG_ERROR, "SDL", "Failed to get JNI Env");
return JNI_VERSION_1_4;
}
Jan 17, 2020
Jan 17, 2020
505
register_methods(env, "org/libsdl/app/SDLActivity", SDLActivity_tab, SDL_arraysize(SDLActivity_tab));
Dec 12, 2019
Dec 12, 2019
506
507
508
register_methods(env, "org/libsdl/app/SDLInputConnection", SDLInputConnection_tab, SDL_arraysize(SDLInputConnection_tab));
register_methods(env, "org/libsdl/app/SDLAudioManager", SDLAudioManager_tab, SDL_arraysize(SDLAudioManager_tab));
register_methods(env, "org/libsdl/app/SDLControllerManager", SDLControllerManager_tab, SDL_arraysize(SDLControllerManager_tab));
Dec 12, 2019
Dec 12, 2019
509
510
511
512
return JNI_VERSION_1_4;
}
Mar 12, 2019
Mar 12, 2019
513
void checkJNIReady(void)
Sep 22, 2017
Sep 22, 2017
514
515
{
if (!mActivityClass || !mAudioManagerClass || !mControllerManagerClass) {
Dec 30, 2018
Dec 30, 2018
516
/* We aren't fully initialized, let's just return. */
Sep 22, 2017
Sep 22, 2017
517
518
519
return;
}
Dec 30, 2018
Dec 30, 2018
520
SDL_SetMainReady();
Sep 22, 2017
Sep 22, 2017
521
522
523
}
/* Activity initialization -- called before SDL_main() to initialize JNI bindings */
Jan 11, 2019
Jan 11, 2019
524
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativeSetupJNI)(JNIEnv *env, jclass cls)
Aug 28, 2017
Aug 28, 2017
526
__android_log_print(ANDROID_LOG_VERBOSE, "SDL", "nativeSetupJNI()");
Jan 11, 2019
Jan 11, 2019
528
529
530
531
532
533
534
535
536
537
538
539
540
/*
* 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
*/
Android_JNI_CreateKey_once();
/* Save JNIEnv of SDLActivity */
Android_JNI_SetEnv(env);
if (mJavaVM == NULL) {
__android_log_print(ANDROID_LOG_ERROR, "SDL", "failed to found a JavaVM");
}
Jan 3, 2019
Jan 3, 2019
541
/* Use a mutex to prevent concurrency issues between Java Activity and Native thread code, when using 'Android_Window'.
Jan 3, 2019
Jan 3, 2019
542
543
* (Eg. Java sending Touch events, while native code is destroying the main SDL_Window. )
*/
Jan 3, 2019
Jan 3, 2019
544
545
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
546
547
}
Jan 3, 2019
Jan 3, 2019
548
if (Android_ActivityMutex == NULL) {
Jan 11, 2019
Jan 11, 2019
549
__android_log_print(ANDROID_LOG_ERROR, "SDL", "failed to create Android_ActivityMutex mutex");
Jan 3, 2019
Jan 3, 2019
550
551
}
Jan 14, 2019
Jan 14, 2019
552
553
554
555
556
557
558
559
560
561
562
Android_PauseSem = SDL_CreateSemaphore(0);
if (Android_PauseSem == NULL) {
__android_log_print(ANDROID_LOG_ERROR, "SDL", "failed to create Android_PauseSem semaphore");
}
Android_ResumeSem = SDL_CreateSemaphore(0);
if (Android_ResumeSem == NULL) {
__android_log_print(ANDROID_LOG_ERROR, "SDL", "failed to create Android_ResumeSem semaphore");
}
Jan 11, 2019
Jan 11, 2019
563
mActivityClass = (jclass)((*env)->NewGlobalRef(env, cls));
Feb 13, 2020
Feb 13, 2020
565
566
567
midClipboardGetText = (*env)->GetStaticMethodID(env, mActivityClass, "clipboardGetText", "()Ljava/lang/String;");
midClipboardHasText = (*env)->GetStaticMethodID(env, mActivityClass, "clipboardHasText", "()Z");
midClipboardSetText = (*env)->GetStaticMethodID(env, mActivityClass, "clipboardSetText", "(Ljava/lang/String;)V");
Jan 11, 2019
Jan 11, 2019
568
midCreateCustomCursor = (*env)->GetStaticMethodID(env, mActivityClass, "createCustomCursor", "([IIIII)I");
Feb 13, 2020
Feb 13, 2020
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
midGetContext = (*env)->GetStaticMethodID(env, mActivityClass, "getContext","()Landroid/content/Context;");
midGetDisplayDPI = (*env)->GetStaticMethodID(env, mActivityClass, "getDisplayDPI", "()Landroid/util/DisplayMetrics;");
midGetManifestEnvironmentVariables = (*env)->GetStaticMethodID(env, mActivityClass, "getManifestEnvironmentVariables", "()Z");
midGetNativeSurface = (*env)->GetStaticMethodID(env, mActivityClass, "getNativeSurface","()Landroid/view/Surface;");
midInitTouch = (*env)->GetStaticMethodID(env, mActivityClass, "initTouch", "()V");
midIsAndroidTV = (*env)->GetStaticMethodID(env, mActivityClass, "isAndroidTV","()Z");
midIsChromebook = (*env)->GetStaticMethodID(env, mActivityClass, "isChromebook", "()Z");
midIsDeXMode = (*env)->GetStaticMethodID(env, mActivityClass, "isDeXMode", "()Z");
midIsScreenKeyboardShown = (*env)->GetStaticMethodID(env, mActivityClass, "isScreenKeyboardShown","()Z");
midIsTablet = (*env)->GetStaticMethodID(env, mActivityClass, "isTablet", "()Z");
midManualBackButton = (*env)->GetStaticMethodID(env, mActivityClass, "manualBackButton", "()V");
midMinimizeWindow = (*env)->GetStaticMethodID(env, mActivityClass, "minimizeWindow","()V");
midOpenAPKExpansionInputStream = (*env)->GetStaticMethodID(env, mActivityClass, "openAPKExpansionInputStream", "(Ljava/lang/String;)Ljava/io/InputStream;");
midRequestPermission = (*env)->GetStaticMethodID(env, mActivityClass, "requestPermission", "(Ljava/lang/String;I)V");
midSendMessage = (*env)->GetStaticMethodID(env, mActivityClass, "sendMessage", "(II)Z");
midSetActivityTitle = (*env)->GetStaticMethodID(env, mActivityClass, "setActivityTitle","(Ljava/lang/String;)Z");
Jan 11, 2019
Jan 11, 2019
585
midSetCustomCursor = (*env)->GetStaticMethodID(env, mActivityClass, "setCustomCursor", "(I)Z");
Feb 13, 2020
Feb 13, 2020
586
587
588
midSetOrientation = (*env)->GetStaticMethodID(env, mActivityClass, "setOrientation","(IIZLjava/lang/String;)V");
midSetRelativeMouseEnabled = (*env)->GetStaticMethodID(env, mActivityClass, "setRelativeMouseEnabled", "(Z)Z");
midSetSurfaceViewFormat = (*env)->GetStaticMethodID(env, mActivityClass, "setSurfaceViewFormat","(I)V");
Jan 11, 2019
Jan 11, 2019
589
midSetSystemCursor = (*env)->GetStaticMethodID(env, mActivityClass, "setSystemCursor", "(I)Z");
Feb 13, 2020
Feb 13, 2020
590
591
592
midSetWindowStyle = (*env)->GetStaticMethodID(env, mActivityClass, "setWindowStyle","(Z)V");
midShouldMinimizeOnFocusLoss = (*env)->GetStaticMethodID(env, mActivityClass, "shouldMinimizeOnFocusLoss","()Z");
midShowTextInput = (*env)->GetStaticMethodID(env, mActivityClass, "showTextInput", "(IIII)Z");
Jan 11, 2019
Jan 11, 2019
593
midSupportsRelativeMouse = (*env)->GetStaticMethodID(env, mActivityClass, "supportsRelativeMouse", "()Z");
Aug 21, 2018
Aug 21, 2018
594
Feb 13, 2020
Feb 13, 2020
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
if (!midClipboardGetText ||
!midClipboardHasText ||
!midClipboardSetText ||
!midCreateCustomCursor ||
!midGetContext ||
!midGetDisplayDPI ||
!midGetManifestEnvironmentVariables ||
!midGetNativeSurface ||
!midInitTouch ||
!midIsAndroidTV ||
!midIsChromebook ||
!midIsDeXMode ||
!midIsScreenKeyboardShown ||
!midIsTablet ||
!midManualBackButton ||
!midMinimizeWindow ||
!midOpenAPKExpansionInputStream ||
!midRequestPermission ||
!midSendMessage ||
!midSetActivityTitle ||
!midSetCustomCursor ||
!midSetOrientation ||
!midSetRelativeMouseEnabled ||
!midSetSurfaceViewFormat ||
!midSetSystemCursor ||
!midSetWindowStyle ||
!midShouldMinimizeOnFocusLoss ||
!midShowTextInput ||
!midSupportsRelativeMouse) {
Aug 28, 2017
Aug 28, 2017
624
__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
626
Sep 22, 2017
Sep 22, 2017
627
628
629
630
checkJNIReady();
}
/* Audio initialization -- called before SDL_main() to initialize JNI bindings */
Jan 11, 2019
Jan 11, 2019
631
JNIEXPORT void JNICALL SDL_JAVA_AUDIO_INTERFACE(nativeSetupJNI)(JNIEnv *env, jclass cls)
Sep 22, 2017
Sep 22, 2017
632
633
634
{
__android_log_print(ANDROID_LOG_VERBOSE, "SDL", "AUDIO nativeSetupJNI()");
Jan 11, 2019
Jan 11, 2019
635
mAudioManagerClass = (jclass)((*env)->NewGlobalRef(env, cls));
Sep 22, 2017
Sep 22, 2017
636
Jan 11, 2019
Jan 11, 2019
637
midAudioOpen = (*env)->GetStaticMethodID(env, mAudioManagerClass,
Oct 10, 2018
Oct 10, 2018
638
"audioOpen", "(IIII)[I");
Jan 11, 2019
Jan 11, 2019
639
midAudioWriteByteBuffer = (*env)->GetStaticMethodID(env, mAudioManagerClass,
Sep 22, 2017
Sep 22, 2017
640
"audioWriteByteBuffer", "([B)V");
Jan 11, 2019
Jan 11, 2019
641
midAudioWriteShortBuffer = (*env)->GetStaticMethodID(env, mAudioManagerClass,
Oct 10, 2018
Oct 10, 2018
642
"audioWriteShortBuffer", "([S)V");
Jan 11, 2019
Jan 11, 2019
643
midAudioWriteFloatBuffer = (*env)->GetStaticMethodID(env, mAudioManagerClass,
Oct 10, 2018
Oct 10, 2018
644
"audioWriteFloatBuffer", "([F)V");
Jan 11, 2019
Jan 11, 2019
645
midAudioClose = (*env)->GetStaticMethodID(env, mAudioManagerClass,
Sep 22, 2017
Sep 22, 2017
646
"audioClose", "()V");
Jan 11, 2019
Jan 11, 2019
647
midCaptureOpen = (*env)->GetStaticMethodID(env, mAudioManagerClass,
Oct 10, 2018
Oct 10, 2018
648
"captureOpen", "(IIII)[I");
Jan 11, 2019
Jan 11, 2019
649
midCaptureReadByteBuffer = (*env)->GetStaticMethodID(env, mAudioManagerClass,
Sep 22, 2017
Sep 22, 2017
650
"captureReadByteBuffer", "([BZ)I");
Jan 11, 2019
Jan 11, 2019
651
midCaptureReadShortBuffer = (*env)->GetStaticMethodID(env, mAudioManagerClass,
Oct 10, 2018
Oct 10, 2018
652
"captureReadShortBuffer", "([SZ)I");
Jan 11, 2019
Jan 11, 2019
653
midCaptureReadFloatBuffer = (*env)->GetStaticMethodID(env, mAudioManagerClass,
Oct 10, 2018
Oct 10, 2018
654
"captureReadFloatBuffer", "([FZ)I");
Jan 11, 2019
Jan 11, 2019
655
midCaptureClose = (*env)->GetStaticMethodID(env, mAudioManagerClass,
Sep 22, 2017
Sep 22, 2017
656
"captureClose", "()V");
Jan 11, 2019
Jan 11, 2019
657
midAudioSetThreadPriority = (*env)->GetStaticMethodID(env, mAudioManagerClass,
Jan 10, 2019
Jan 10, 2019
658
"audioSetThreadPriority", "(ZI)V");
Sep 22, 2017
Sep 22, 2017
659
Oct 10, 2018
Oct 10, 2018
660
if (!midAudioOpen || !midAudioWriteByteBuffer || !midAudioWriteShortBuffer || !midAudioWriteFloatBuffer || !midAudioClose ||
Jan 10, 2019
Jan 10, 2019
661
!midCaptureOpen || !midCaptureReadByteBuffer || !midCaptureReadShortBuffer || !midCaptureReadFloatBuffer || !midCaptureClose || !midAudioSetThreadPriority) {
Sep 22, 2017
Sep 22, 2017
662
663
664
665
666
667
668
__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 11, 2019
Jan 11, 2019
669
JNIEXPORT void JNICALL SDL_JAVA_CONTROLLER_INTERFACE(nativeSetupJNI)(JNIEnv *env, jclass cls)
Sep 22, 2017
Sep 22, 2017
670
671
672
{
__android_log_print(ANDROID_LOG_VERBOSE, "SDL", "CONTROLLER nativeSetupJNI()");
Jan 11, 2019
Jan 11, 2019
673
mControllerManagerClass = (jclass)((*env)->NewGlobalRef(env, cls));
Sep 22, 2017
Sep 22, 2017
674
Jan 11, 2019
Jan 11, 2019
675
midPollInputDevices = (*env)->GetStaticMethodID(env, mControllerManagerClass,
Sep 22, 2017
Sep 22, 2017
676
"pollInputDevices", "()V");
Jan 11, 2019
Jan 11, 2019
677
midPollHapticDevices = (*env)->GetStaticMethodID(env, mControllerManagerClass,
Sep 22, 2017
Sep 22, 2017
678
"pollHapticDevices", "()V");
Jan 11, 2019
Jan 11, 2019
679
midHapticRun = (*env)->GetStaticMethodID(env, mControllerManagerClass,
Oct 16, 2018
Oct 16, 2018
680
"hapticRun", "(IFI)V");
Jan 11, 2019
Jan 11, 2019
681
midHapticStop = (*env)->GetStaticMethodID(env, mControllerManagerClass,
Aug 24, 2018
Aug 24, 2018
682
"hapticStop", "(I)V");
Sep 22, 2017
Sep 22, 2017
683
Aug 24, 2018
Aug 24, 2018
684
if (!midPollInputDevices || !midPollHapticDevices || !midHapticRun || !midHapticStop) {
Sep 22, 2017
Sep 22, 2017
685
686
687
688
__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
689
690
691
692
693
694
}
/* SDL main function prototype */
typedef int (*SDL_main_func)(int argc, char *argv[]);
/* Start up the SDL app */
Jan 3, 2019
Jan 3, 2019
695
JNIEXPORT int JNICALL SDL_JAVA_INTERFACE(nativeRunMain)(JNIEnv *env, jclass cls, jstring library, jstring function, jobject array)
Aug 28, 2017
Aug 28, 2017
696
697
698
699
700
{
int status = -1;
const char *library_file;
void *library_handle;
Aug 28, 2017
Aug 28, 2017
701
702
__android_log_print(ANDROID_LOG_VERBOSE, "SDL", "nativeRunMain()");
Jan 11, 2019
Jan 11, 2019
703
704
705
/* Save JNIEnv of SDLThread */
Android_JNI_SetEnv(env);
Aug 28, 2017
Aug 28, 2017
706
707
library_file = (*env)->GetStringUTFChars(env, library, NULL);
library_handle = dlopen(library_file, RTLD_GLOBAL);
Jul 27, 2019
Jul 27, 2019
708
709
710
711
712
713
714
715
716
717
718
if (!library_handle) {
/* When deploying android app bundle format uncompressed native libs may not extract from apk to filesystem.
In this case we should use lib name without path. https://bugzilla.libsdl.org/show_bug.cgi?id=4739 */
const char *library_name = SDL_strrchr(library_file, '/');
if (library_name && *library_name) {
library_name += 1;
library_handle = dlopen(library_name, RTLD_GLOBAL);
}
}
Aug 28, 2017
Aug 28, 2017
719
720
721
722
723
724
725
726
727
728
729
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
730
SDL_bool isstack;
Aug 28, 2017
Aug 28, 2017
731
732
733
/* Prepare the arguments. */
len = (*env)->GetArrayLength(env, array);
Jan 3, 2019
Jan 3, 2019
734
argv = SDL_small_alloc(char *, 1 + len + 1, &isstack); /* !!! FIXME: check for NULL */
Aug 28, 2017
Aug 28, 2017
735
736
737
738
739
740
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
741
742
const char *utf;
char *arg = NULL;
Aug 28, 2017
Aug 28, 2017
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
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
767
SDL_small_free(argv, isstack);
Aug 28, 2017
Aug 28, 2017
768
769
770
771
772
773
774
775
776
777
} 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
778
}
Aug 28, 2017
Aug 28, 2017
779
780
(*env)->ReleaseStringUTFChars(env, library, library_file);
Jan 11, 2019
Jan 11, 2019
781
/* This is a Java thread, it doesn't need to be Detached from the JVM.
Jan 11, 2019
Jan 11, 2019
782
783
784
* Set to mThreadKey value to NULL not to call pthread_create destructor 'Android_JNI_ThreadDestroyed' */
Android_JNI_SetEnv(NULL);
Aug 28, 2017
Aug 28, 2017
785
786
/* 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
787
Aug 28, 2017
Aug 28, 2017
788
return status;
789
790
791
}
/* Drop file */
Dec 2, 2016
Dec 2, 2016
792
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeDropFile)(
Jan 3, 2019
Jan 3, 2019
793
JNIEnv *env, jclass jcls,
794
795
796
jstring filename)
{
const char *path = (*env)->GetStringUTFChars(env, filename, NULL);
Jan 5, 2016
Jan 5, 2016
797
SDL_SendDropFile(NULL, path);
798
(*env)->ReleaseStringUTFChars(env, filename, path);
Jan 5, 2016
Jan 5, 2016
799
SDL_SendDropComplete(NULL);
Jun 24, 2019
Jun 24, 2019
802
803
804
805
806
807
808
809
810
/* Lock / Unlock Mutex */
void Android_ActivityMutex_Lock() {
SDL_LockMutex(Android_ActivityMutex);
}
void Android_ActivityMutex_Unlock() {
SDL_UnlockMutex(Android_ActivityMutex);
}
Jun 28, 2019
Jun 28, 2019
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
/* Lock the Mutex when the Activity is in its 'Running' state */
void Android_ActivityMutex_Lock_Running() {
int pauseSignaled = 0;
int resumeSignaled = 0;
retry:
SDL_LockMutex(Android_ActivityMutex);
pauseSignaled = SDL_SemValue(Android_PauseSem);
resumeSignaled = SDL_SemValue(Android_ResumeSem);
if (pauseSignaled > resumeSignaled) {
SDL_UnlockMutex(Android_ActivityMutex);
SDL_Delay(50);
goto retry;
}
}
Jan 17, 2019
Jan 17, 2019
830
831
/* Set screen resolution */
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativeSetScreenResolution)(
Jan 3, 2019
Jan 3, 2019
832
JNIEnv *env, jclass jcls,
Jun 8, 2018
Jun 8, 2018
833
jint surfaceWidth, jint surfaceHeight,
Sep 24, 2018
Sep 24, 2018
834
jint deviceWidth, jint deviceHeight, jint format, jfloat rate)
Jan 3, 2019
Jan 3, 2019
836
SDL_LockMutex(Android_ActivityMutex);
Jan 3, 2019
Jan 3, 2019
837
Jan 17, 2019
Jan 17, 2019
838
839
840
841
842
843
844
845
846
847
848
849
850
Android_SetScreenResolution(surfaceWidth, surfaceHeight, deviceWidth, deviceHeight, format, rate);
SDL_UnlockMutex(Android_ActivityMutex);
}
/* Resize */
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeResize)(
JNIEnv *env, jclass jcls)
{
SDL_LockMutex(Android_ActivityMutex);
if (Android_Window)
{
Jun 18, 2019
Jun 18, 2019
851
Android_SendResize(Android_Window);
Jan 17, 2019
Jan 17, 2019
852
}
Jan 3, 2019
Jan 3, 2019
853
Jan 3, 2019
Jan 3, 2019
854
SDL_UnlockMutex(Android_ActivityMutex);
Aug 23, 2018
Aug 23, 2018
857
858
859
860
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeOrientationChanged)(
JNIEnv *env, jclass jcls,
jint orientation)
{
Jan 16, 2019
Jan 16, 2019
861
862
SDL_LockMutex(Android_ActivityMutex);
Mar 12, 2019
Mar 12, 2019
863
displayOrientation = (SDL_DisplayOrientation)orientation;
Mar 13, 2019
Mar 13, 2019
864
865
866
867
868
869
if (Android_Window)
{
SDL_VideoDisplay *display = SDL_GetDisplay(0);
SDL_SendDisplayEvent(display, SDL_DISPLAYEVENT_ORIENTATION, orientation);
}
Jan 16, 2019
Jan 16, 2019
870
871
SDL_UnlockMutex(Android_ActivityMutex);
Aug 23, 2018
Aug 23, 2018
872
873
}
Jan 10, 2019
Jan 10, 2019
874
875
876
877
878
879
880
881
882
883
884
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativeAddTouch)(
JNIEnv* env, jclass cls,
jint touchId, jstring name)
{
const char *utfname = (*env)->GetStringUTFChars(env, name, NULL);
SDL_AddTouch((SDL_TouchID) touchId, SDL_TOUCH_DEVICE_DIRECT, utfname);
(*env)->ReleaseStringUTFChars(env, name, utfname);
}
Feb 13, 2020
Feb 13, 2020
885
886
887
888
889
890
891
892
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativePermissionResult)(
JNIEnv* env, jclass cls,
jint requestCode, jboolean result)
{
bPermissionRequestResult = result;
SDL_AtomicSet(&bPermissionRequestPending, SDL_FALSE);
}
Sep 22, 2017
Sep 22, 2017
894
JNIEXPORT jint JNICALL SDL_JAVA_CONTROLLER_INTERFACE(onNativePadDown)(
Jan 3, 2019
Jan 3, 2019
895
JNIEnv *env, jclass jcls,
896
897
898
899
900
901
jint device_id, jint keycode)
{
return Android_OnPadDown(device_id, keycode);
}
/* Padup */
Sep 22, 2017
Sep 22, 2017
902
JNIEXPORT jint JNICALL SDL_JAVA_CONTROLLER_INTERFACE(onNativePadUp)(
Jan 3, 2019
Jan 3, 2019
903
JNIEnv *env, jclass jcls,
Dec 2, 2016
Dec 2, 2016
904
jint device_id, jint keycode)
905
906
907
908
909
{
return Android_OnPadUp(device_id, keycode);
}
/* Joy */
Sep 22, 2017
Sep 22, 2017
910
JNIEXPORT void JNICALL SDL_JAVA_CONTROLLER_INTERFACE(onNativeJoy)(
Jan 3, 2019
Jan 3, 2019
911
JNIEnv *env, jclass jcls,
912
913
914
915
916
917
jint device_id, jint axis, jfloat value)
{
Android_OnJoy(device_id, axis, value);
}
/* POV Hat */
Sep 22, 2017
Sep 22, 2017
918
JNIEXPORT void JNICALL SDL_JAVA_CONTROLLER_INTERFACE(onNativeHat)(
Jan 3, 2019
Jan 3, 2019
919
JNIEnv *env, jclass jcls,
920
921
922
923
924
925
jint device_id, jint hat_id, jint x, jint y)
{
Android_OnHat(device_id, hat_id, x, y);
}
Sep 22, 2017
Sep 22, 2017
926
JNIEXPORT jint JNICALL SDL_JAVA_CONTROLLER_INTERFACE(nativeAddJoystick)(
Jan 3, 2019
Jan 3, 2019
927
JNIEnv *env, jclass jcls,
Mar 6, 2018
Mar 6, 2018
928
929
930
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)
931
932
933
{
int retval;
const char *name = (*env)->GetStringUTFChars(env, device_name, NULL);
Aug 28, 2017
Aug 28, 2017
934
const char *desc = (*env)->GetStringUTFChars(env, device_desc, NULL);
Mar 6, 2018
Mar 6, 2018
936
retval = Android_AddJoystick(device_id, name, desc, vendor_id, product_id, is_accelerometer ? SDL_TRUE : SDL_FALSE, button_mask, naxes, nhats, nballs);
937
938
(*env)->ReleaseStringUTFChars(env, device_name, name);
Aug 28, 2017
Aug 28, 2017
939
(*env)->ReleaseStringUTFChars(env, device_desc, desc);
Aug 14, 2017
Aug 14, 2017
940
941
942
943
return retval;
}
Sep 22, 2017
Sep 22, 2017
944
JNIEXPORT jint JNICALL SDL_JAVA_CONTROLLER_INTERFACE(nativeRemoveJoystick)(
Jan 3, 2019
Jan 3, 2019
945
JNIEnv *env, jclass jcls,
Dec 2, 2016
Dec 2, 2016
946
jint device_id)
947
948
949
950
{
return Android_RemoveJoystick(device_id);
}
Sep 22, 2017
Sep 22, 2017
951
JNIEXPORT jint JNICALL SDL_JAVA_CONTROLLER_INTERFACE(nativeAddHaptic)(
Jan 3, 2019
Jan 3, 2019
952
JNIEnv *env, jclass jcls, jint device_id, jstring device_name)
Aug 12, 2017
Aug 12, 2017
953
954
955
956
957
958
959
960
961
962
963
{
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
964
JNIEXPORT jint JNICALL SDL_JAVA_CONTROLLER_INTERFACE(nativeRemoveHaptic)(
Jan 3, 2019
Jan 3, 2019
965
JNIEnv *env, jclass jcls, jint device_id)
Aug 12, 2017
Aug 12, 2017
966
967
968
969
{
return Android_RemoveHaptic(device_id);
}
Jan 9, 2019
Jan 9, 2019
970
971
972
973
974
/* Called from surfaceCreated() */
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeSurfaceCreated)(JNIEnv *env, jclass jcls)
{
SDL_LockMutex(Android_ActivityMutex);
Jan 16, 2019
Jan 16, 2019
975
if (Android_Window)
Jan 9, 2019
Jan 9, 2019
976
977
978
979
980
981
982
983
984
985
986
{
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
988
/* Called from surfaceChanged() */
Jan 3, 2019
Jan 3, 2019
989
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeSurfaceChanged)(JNIEnv *env, jclass jcls)
Jan 3, 2019
Jan 3, 2019
991
SDL_LockMutex(Android_ActivityMutex);
Jan 3, 2019
Jan 3, 2019
992
Jan 16, 2019
Jan 16, 2019
993
if (Android_Window)
Jan 3, 2019
Jan 3, 2019
994
995
996
{
SDL_VideoDevice *_this = SDL_GetVideoDevice();
SDL_WindowData *data = (SDL_WindowData *) Android_Window->driverdata;
Jan 3, 2019
Jan 3, 2019
998
999
1000
/* 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);