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 getScummVMAssetsPath();
99  static Common::String getScummVMConfigPath();
100  static Common::String getScummVMLogPath();
101  static jint getAndroidSDKVersionId();
102  static void setCurrentGame(const Common::String &target);
103 
104  static inline bool haveSurface();
105  static inline bool swapBuffers();
106  static bool initSurface();
107  static void deinitSurface();
108  static int eglVersion() {
109  if (_egl_version) {
110  return _egl_version;
111  }
112  return fetchEGLVersion();
113  }
114 
115  static void setAudioPause();
116  static void setAudioPlay();
117  static void setAudioStop();
118 
119  static inline int writeAudio(JNIEnv *env, jbyteArray &data, int offset,
120  int size);
121 
122  static Common::Array<Common::String> getAllStorageLocations();
123 
124  static jobject getNewSAFTree(bool folder, bool writable, const Common::String &initURI, const Common::String &prompt);
125  static Common::Array<jobject> getSAFTrees();
126  static jobject findSAFTree(const Common::String &name);
127 
128 private:
129  static pthread_key_t _env_tls;
130 
131  static JavaVM *_vm;
132  // back pointer to (java) peer instance
133  static jobject _jobj;
134  static jobject _jobj_audio_track;
135  static jobject _jobj_egl;
136  static jobject _jobj_egl_display;
137  static jobject _jobj_egl_surface;
138  // cached EGL version
139  static int _egl_version;
140 
141  static Common::Archive *_asset_archive;
142  static OSystem_Android *_system;
143 
144  static bool _ready_for_events;
145 
146  static jmethodID _MID_getDPI;
147  static jmethodID _MID_displayMessageOnOSD;
148  static jmethodID _MID_openUrl;
149  static jmethodID _MID_hasTextInClipboard;
150  static jmethodID _MID_getTextFromClipboard;
151  static jmethodID _MID_setTextInClipboard;
152  static jmethodID _MID_isConnectionLimited;
153  static jmethodID _MID_setWindowCaption;
154  static jmethodID _MID_showVirtualKeyboard;
155  static jmethodID _MID_showOnScreenControls;
156  static jmethodID _MID_setTouchMode;
157  static jmethodID _MID_getTouchMode;
158  static jmethodID _MID_setOrientation;
159  static jmethodID _MID_getScummVMBasePath;
160  static jmethodID _MID_getScummVMConfigPath;
161  static jmethodID _MID_getScummVMLogPath;
162  static jmethodID _MID_setCurrentGame;
163  static jmethodID _MID_getSysArchives;
164  static jmethodID _MID_getAllStorageLocations;
165  static jmethodID _MID_initSurface;
166  static jmethodID _MID_deinitSurface;
167  static jmethodID _MID_eglVersion;
168  static jmethodID _MID_getNewSAFTree;
169  static jmethodID _MID_getSAFTrees;
170  static jmethodID _MID_findSAFTree;
171 
172  static jmethodID _MID_EGL10_eglSwapBuffers;
173 
174  static jmethodID _MID_AudioTrack_flush;
175  static jmethodID _MID_AudioTrack_pause;
176  static jmethodID _MID_AudioTrack_play;
177  static jmethodID _MID_AudioTrack_stop;
178  static jmethodID _MID_AudioTrack_write;
179 
180  static const JNINativeMethod _natives[];
181 
182  static void throwByName(JNIEnv *env, const char *name, const char *msg);
183  static void throwRuntimeException(JNIEnv *env, const char *msg);
184 
185  // natives for the dark side
186  static void create(JNIEnv *env, jobject self, jobject asset_manager,
187  jobject egl, jobject egl_display,
188  jobject at, jint audio_sample_rate,
189  jint audio_buffer_size,
190  jboolean assets_updated_);
191  static void destroy(JNIEnv *env, jobject self);
192 
193  static void setSurface(JNIEnv *env, jobject self, jint width, jint height, jint bpp);
194  static jint main(JNIEnv *env, jobject self, jobjectArray args);
195 
196  static void pushEvent(JNIEnv *env, jobject self, int type, int arg1,
197  int arg2, int arg3, int arg4, int arg5, int arg6);
198  static void updateTouch(JNIEnv *env, jobject self, int action, int ptr, int x, int y);
199  static void setupTouchMode(JNIEnv *env, jobject self, jint oldValue, jint newValue);
200  static void syncVirtkeyboardState(JNIEnv *env, jobject self, jboolean newState);
201  static void setPause(JNIEnv *env, jobject self, jboolean value);
202 
203  static void systemInsetsUpdated(JNIEnv *env, jobject self, jintArray gestureInsets, jintArray systemInsets, jintArray cutoutInsets);
204 
205  static jstring getNativeVersionInfo(JNIEnv *env, jobject self);
206  static jstring convertToJString(JNIEnv *env, const Common::U32String &str);
207  static Common::U32String convertFromJString(JNIEnv *env, const jstring &jstr);
208 
209  static PauseToken _pauseToken;
210 
211  static JNIEnv *fetchEnv();
212  static int fetchEGLVersion();
213 };
214 
215 inline bool JNI::haveSurface() {
216  return _jobj_egl_surface != 0;
217 }
218 
219 inline bool JNI::swapBuffers() {
220  JNIEnv *env = JNI::getEnv();
221 
222  return env->CallBooleanMethod(_jobj_egl, _MID_EGL10_eglSwapBuffers,
223  _jobj_egl_display, _jobj_egl_surface);
224 }
225 
226 inline int JNI::writeAudio(JNIEnv *env, jbyteArray &data, int offset, int size) {
227  return env->CallIntMethod(_jobj_audio_track, _MID_AudioTrack_write, data,
228  offset, size);
229 }
230 
231 #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