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 
34 namespace Graphics {
35  struct Surface;
36 }
37 
38 class OSystem_Android;
39 
40 class JNI {
41 private:
42  JNI();
43  virtual ~JNI();
44 
45 public:
46  static bool assets_updated;
47 
48  static bool pause;
49  static sem_t pause_sem;
50 
51  static int surface_changeid;
52  static int egl_surface_width;
53  static int egl_surface_height;
54  static int egl_bits_per_pixel;
55 
56  static bool virt_keyboard_state;
57 
58  static int32 gestures_insets[4];
59  static int32 cutout_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 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  static int exportBackup(const Common::U32String &prompt);
129  static int importBackup(const Common::U32String &prompt, const Common::String &path);
130 
131 private:
132  static pthread_key_t _env_tls;
133 
134  static JavaVM *_vm;
135  // back pointer to (java) peer instance
136  static jobject _jobj;
137  static jobject _jobj_audio_track;
138  static jobject _jobj_egl;
139  static jobject _jobj_egl_display;
140  static jobject _jobj_egl_surface;
141  // cached EGL version
142  static int _egl_version;
143 
144  static Common::Archive *_asset_archive;
145  static OSystem_Android *_system;
146 
147  static bool _ready_for_events;
148 
149  static jmethodID _MID_getDPI;
150  static jmethodID _MID_displayMessageOnOSD;
151  static jmethodID _MID_openUrl;
152  static jmethodID _MID_hasTextInClipboard;
153  static jmethodID _MID_getTextFromClipboard;
154  static jmethodID _MID_setTextInClipboard;
155  static jmethodID _MID_isConnectionLimited;
156  static jmethodID _MID_setWindowCaption;
157  static jmethodID _MID_showVirtualKeyboard;
158  static jmethodID _MID_showOnScreenControls;
159  static jmethodID _MID_setTouchMode;
160  static jmethodID _MID_getTouchMode;
161  static jmethodID _MID_setOrientation;
162  static jmethodID _MID_getScummVMBasePath;
163  static jmethodID _MID_getScummVMConfigPath;
164  static jmethodID _MID_getScummVMLogPath;
165  static jmethodID _MID_setCurrentGame;
166  static jmethodID _MID_getSysArchives;
167  static jmethodID _MID_getAllStorageLocations;
168  static jmethodID _MID_initSurface;
169  static jmethodID _MID_deinitSurface;
170  static jmethodID _MID_eglVersion;
171  static jmethodID _MID_getNewSAFTree;
172  static jmethodID _MID_getSAFTrees;
173  static jmethodID _MID_findSAFTree;
174  static jmethodID _MID_exportBackup;
175  static jmethodID _MID_importBackup;
176 
177  static jmethodID _MID_EGL10_eglSwapBuffers;
178 
179  static jmethodID _MID_AudioTrack_flush;
180  static jmethodID _MID_AudioTrack_pause;
181  static jmethodID _MID_AudioTrack_play;
182  static jmethodID _MID_AudioTrack_stop;
183  static jmethodID _MID_AudioTrack_write;
184 
185  static const JNINativeMethod _natives[];
186 
187  static void throwByName(JNIEnv *env, const char *name, const char *msg);
188  static void throwRuntimeException(JNIEnv *env, const char *msg);
189 
190  // natives for the dark side
191  static void create(JNIEnv *env, jobject self, jobject asset_manager,
192  jobject egl, jobject egl_display,
193  jobject at, jint audio_sample_rate,
194  jint audio_buffer_size,
195  jboolean assets_updated_);
196  static void destroy(JNIEnv *env, jobject self);
197 
198  static void setSurface(JNIEnv *env, jobject self, jint width, jint height, jint bpp);
199  static jint main(JNIEnv *env, jobject self, jobjectArray args);
200 
201  static void pushEvent(JNIEnv *env, jobject self, int type, int arg1,
202  int arg2, int arg3, int arg4, int arg5, int arg6);
203  static void updateTouch(JNIEnv *env, jobject self, int action, int ptr, int x, int y);
204  static void setupTouchMode(JNIEnv *env, jobject self, jint oldValue, jint newValue);
205  static void syncVirtkeyboardState(JNIEnv *env, jobject self, jboolean newState);
206  static void setPause(JNIEnv *env, jobject self, jboolean value);
207 
208  static void systemInsetsUpdated(JNIEnv *env, jobject self, jintArray gestureInsets, jintArray systemInsets, jintArray cutoutInsets);
209 
210  static jstring getNativeVersionInfo(JNIEnv *env, jobject self);
211  static jstring convertToJString(JNIEnv *env, const Common::U32String &str);
212  static Common::U32String convertFromJString(JNIEnv *env, const jstring &jstr);
213 
214  static JNIEnv *fetchEnv();
215  static int fetchEGLVersion();
216 };
217 
218 inline bool JNI::haveSurface() {
219  return _jobj_egl_surface != 0;
220 }
221 
222 inline bool JNI::swapBuffers() {
223  JNIEnv *env = JNI::getEnv();
224 
225  return env->CallBooleanMethod(_jobj_egl, _MID_EGL10_eglSwapBuffers,
226  _jobj_egl_display, _jobj_egl_surface);
227 }
228 
229 inline int JNI::writeAudio(JNIEnv *env, jbyteArray &data, int offset, int size) {
230  return env->CallIntMethod(_jobj_audio_track, _MID_AudioTrack_write, data,
231  offset, size);
232 }
233 
234 #endif
Definition: str.h:59
Definition: archive.h:141
Definition: ustr.h:57
Definition: archive.h:330
Definition: jni-android.h:40
Definition: formatinfo.h:28
Definition: android.h:100