ScummVM API documentation
jni-android.h
1 /* ScummVM - Graphic Adventure Engine
2  *
3  * ScummVM is the legal property of its developers, whose names
4  * are too numerous to list here. Please refer to the COPYRIGHT
5  * file distributed with this source distribution.
6  *
7  * This program is free software: you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation, either version 3 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program. If not, see <http://www.gnu.org/licenses/>.
19  *
20  */
21 
22 #ifndef _ANDROID_JNI_H_
23 #define _ANDROID_JNI_H_
24 
25 #include <jni.h>
26 #include <semaphore.h>
27 #include <pthread.h>
28 
29 #include "common/fs.h"
30 #include "common/archive.h"
31 #include "common/array.h"
32 #include "common/ustr.h"
33 #include "engines/engine.h"
34 
35 namespace Graphics {
36  struct Surface;
37 }
38 
39 class OSystem_Android;
40 
41 class JNI {
42 private:
43  JNI();
44  virtual ~JNI();
45 
46 public:
47  static bool assets_updated;
48 
49  static bool pause;
50  static sem_t pause_sem;
51 
52  static int surface_changeid;
53  static int egl_surface_width;
54  static int egl_surface_height;
55  static int egl_bits_per_pixel;
56 
57  static bool virt_keyboard_state;
58 
59  static int32 gestures_insets[4];
60 
61  static jint onLoad(JavaVM *vm);
62 
63  static inline JNIEnv *getEnv() {
64  JNIEnv *env = (JNIEnv*) pthread_getspecific(_env_tls);
65  if (env != nullptr) {
66  return env;
67  }
68 
69  return fetchEnv();
70  }
71 
72  static void attachThread();
73  static void detachThread();
74 
75  static void setReadyForEvents(bool ready);
76  static void wakeupForQuit();
77 
78  static void setWindowCaption(const Common::U32String &caption);
79 
83  typedef float DPIValues[3];
84  static void getDPI(DPIValues &values);
85  static void displayMessageOnOSD(const Common::U32String &msg);
86  static bool openUrl(const Common::String &url);
87  static bool hasTextInClipboard();
88  static Common::U32String getTextFromClipboard();
89  static bool setTextInClipboard(const Common::U32String &text);
90  static bool isConnectionLimited();
91  static void showVirtualKeyboard(bool enable);
92  static void showOnScreenControls(int enableMask);
93  static void setTouchMode(int touchMode);
94  static int getTouchMode();
95  static void setOrientation(int touchMode);
96  static void addSysArchivesToSearchSet(Common::SearchSet &s, int priority);
97  static Common::String getScummVMBasePath();
98  static Common::String getScummVMConfigPath();
99  static Common::String getScummVMLogPath();
100  static jint getAndroidSDKVersionId();
101  static void setCurrentGame(const Common::String &target);
102 
103  static inline bool haveSurface();
104  static inline bool swapBuffers();
105  static bool initSurface();
106  static void deinitSurface();
107  static int eglVersion() {
108  if (_egl_version) {
109  return _egl_version;
110  }
111  return fetchEGLVersion();
112  }
113 
114  static void setAudioPause();
115  static void setAudioPlay();
116  static void setAudioStop();
117 
118  static inline int writeAudio(JNIEnv *env, jbyteArray &data, int offset,
119  int size);
120 
121  static Common::Array<Common::String> getAllStorageLocations();
122 
123  static jobject getNewSAFTree(bool folder, bool writable, const Common::String &initURI, const Common::String &prompt);
124  static Common::Array<jobject> getSAFTrees();
125  static jobject findSAFTree(const Common::String &name);
126 
127 private:
128  static pthread_key_t _env_tls;
129 
130  static JavaVM *_vm;
131  // back pointer to (java) peer instance
132  static jobject _jobj;
133  static jobject _jobj_audio_track;
134  static jobject _jobj_egl;
135  static jobject _jobj_egl_display;
136  static jobject _jobj_egl_surface;
137  // cached EGL version
138  static int _egl_version;
139 
140  static Common::Archive *_asset_archive;
141  static OSystem_Android *_system;
142 
143  static bool _ready_for_events;
144 
145  static jmethodID _MID_getDPI;
146  static jmethodID _MID_displayMessageOnOSD;
147  static jmethodID _MID_openUrl;
148  static jmethodID _MID_hasTextInClipboard;
149  static jmethodID _MID_getTextFromClipboard;
150  static jmethodID _MID_setTextInClipboard;
151  static jmethodID _MID_isConnectionLimited;
152  static jmethodID _MID_setWindowCaption;
153  static jmethodID _MID_showVirtualKeyboard;
154  static jmethodID _MID_showOnScreenControls;
155  static jmethodID _MID_setTouchMode;
156  static jmethodID _MID_getTouchMode;
157  static jmethodID _MID_setOrientation;
158  static jmethodID _MID_getScummVMBasePath;
159  static jmethodID _MID_getScummVMConfigPath;
160  static jmethodID _MID_getScummVMLogPath;
161  static jmethodID _MID_setCurrentGame;
162  static jmethodID _MID_getSysArchives;
163  static jmethodID _MID_getAllStorageLocations;
164  static jmethodID _MID_initSurface;
165  static jmethodID _MID_deinitSurface;
166  static jmethodID _MID_eglVersion;
167  static jmethodID _MID_getNewSAFTree;
168  static jmethodID _MID_getSAFTrees;
169  static jmethodID _MID_findSAFTree;
170 
171  static jmethodID _MID_EGL10_eglSwapBuffers;
172 
173  static jmethodID _MID_AudioTrack_flush;
174  static jmethodID _MID_AudioTrack_pause;
175  static jmethodID _MID_AudioTrack_play;
176  static jmethodID _MID_AudioTrack_stop;
177  static jmethodID _MID_AudioTrack_write;
178 
179  static const JNINativeMethod _natives[];
180 
181  static void throwByName(JNIEnv *env, const char *name, const char *msg);
182  static void throwRuntimeException(JNIEnv *env, const char *msg);
183 
184  // natives for the dark side
185  static void create(JNIEnv *env, jobject self, jobject asset_manager,
186  jobject egl, jobject egl_display,
187  jobject at, jint audio_sample_rate,
188  jint audio_buffer_size,
189  jboolean assets_updated_);
190  static void destroy(JNIEnv *env, jobject self);
191 
192  static void setSurface(JNIEnv *env, jobject self, jint width, jint height, jint bpp);
193  static jint main(JNIEnv *env, jobject self, jobjectArray args);
194 
195  static void pushEvent(JNIEnv *env, jobject self, int type, int arg1,
196  int arg2, int arg3, int arg4, int arg5, int arg6);
197  static void updateTouch(JNIEnv *env, jobject self, int action, int ptr, int x, int y);
198  static void setupTouchMode(JNIEnv *env, jobject self, jint oldValue, jint newValue);
199  static void syncVirtkeyboardState(JNIEnv *env, jobject self, jboolean newState);
200  static void setPause(JNIEnv *env, jobject self, jboolean value);
201 
202  static void systemInsetsUpdated(JNIEnv *env, jobject self, jintArray gestureInsets, jintArray systemInsets, jintArray cutoutInsets);
203 
204  static jstring getNativeVersionInfo(JNIEnv *env, jobject self);
205  static jstring convertToJString(JNIEnv *env, const Common::U32String &str);
206  static Common::U32String convertFromJString(JNIEnv *env, const jstring &jstr);
207 
208  static PauseToken _pauseToken;
209 
210  static JNIEnv *fetchEnv();
211  static int fetchEGLVersion();
212 };
213 
214 inline bool JNI::haveSurface() {
215  return _jobj_egl_surface != 0;
216 }
217 
218 inline bool JNI::swapBuffers() {
219  JNIEnv *env = JNI::getEnv();
220 
221  return env->CallBooleanMethod(_jobj_egl, _MID_EGL10_eglSwapBuffers,
222  _jobj_egl_display, _jobj_egl_surface);
223 }
224 
225 inline int JNI::writeAudio(JNIEnv *env, jbyteArray &data, int offset, int size) {
226  return env->CallIntMethod(_jobj_audio_track, _MID_AudioTrack_write, data,
227  offset, size);
228 }
229 
230 #endif
Definition: engine.h:103
Definition: str.h:59
Definition: archive.h:141
Definition: ustr.h:57
Definition: archive.h:312
Definition: jni-android.h:41
Definition: formatinfo.h:28
Definition: android.h:99