1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
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
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
// Copyright 2020-2022 The Defold Foundation
// Copyright 2014-2020 King
// Copyright 2009-2014 Ragnar Svensson, Christian Murray
// Licensed under the Defold License version 1.0 (the "License"); you may not use
// this file except in compliance with the License.
//
// You may obtain a copy of the License, together with FAQs at
// https://www.defold.com/license
//
// Unless required by applicable law or agreed to in writing, software distributed
// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
// CONDITIONS OF ANY KIND, either express or implied. See the License for the
// specific language governing permissions and limitations under the License.
#ifndef DMSDK_ANDROID_H
#define DMSDK_ANDROID_H
#if defined(ANDROID)
#include <jni.h>
#include <android_native_app_glue.h> // For ANativeActivity
/*# SDK Android API documentation
* Android utility functions
*
* @document
* @name Android
* @namespace dmAndroid
* @path engine/dlib/src/dmsdk/dlib/android.h
*/
namespace dmAndroid {
/*#
* Struct attaching the JNI environment. Detaches the
* @class
* @name ThreadAttacher
*/
class ThreadAttacher
{
ANativeActivity* m_Activity;
JNIEnv* m_Env;
bool m_IsAttached;
public:
/*# constructor
*
* @name ThreadAttacher
* @examples
*
* ```cpp
* {
* ThreadAttacher thread;
* SomeFunction( thread.GetEnv() );
* // Automatically detaches
* }
* ```
*
* ```cpp
* {
* ThreadAttacher thread;
* JNIEnv* env = thread.GetEnv();
* if (!env)
* return;
* ...
* }
* ```
*/
ThreadAttacher();
~ThreadAttacher()
{
Detach();
}
/*# Detaches the jni environment
*
* @name Detach
* @return ok [type:bool] true if there was no java exceptions. False if there was an exception.
*/
bool Detach();
/*# Is the environment attached and valid?
*
* @name IsAttached
* @return isattached [type:bool] true if the environment is valid
*
* @examples
*
* ```cpp
* Result SomeFunc() {
* ThreadAttacher thread;
* JNIEnv* env = thread.GetEnv();
* if (!env)
* return RESULT_ATTACH_FAILED;
* ... calls using jni
* return thread.Detach() ? RESULT_OK : RESULT_JNI_CALLS_FAILED;
* }
* ```
*/
bool IsAttached()
{
return m_IsAttached;
}
/*# Gets the JNI environment
*
* @name GetEnv
* @return env [type:JNIENV*] the attached environment
*/
JNIEnv* GetEnv()
{
return m_Env;
}
/*# Gets the app native activity
*
* @name GetActivity
* @return activity [type:ANativeActivity*] the app native activity
*/
ANativeActivity* GetActivity()
{
return m_Activity;
}
};
/*# Load a class
*
* @name LoadClass
* @param env [type:JNIEnv*]
* @param class_name [type:const char*]
* @return class [type:jclass] the activity class loader
*/
jclass LoadClass(JNIEnv* env, const char* class_name);
/*# Load a class
*
* @name LoadClass
* @param env [type:JNIEnv*]
* @param activity [type:jobject]
* @param class_name [type:const char*]
* @return class [type:jclass] the activity class loader
*/
jclass LoadClass(JNIEnv* env, jobject activity, const char* class_name);
/*# OnActivityResult callback typedef
*
* Activity result callback function type. Monitors events from the main activity.
* Used with RegisterOnActivityResultListener() and UnregisterOnActivityResultListener()
*
* @typedef
* @name OnActivityResult
* @param env [type:JNIEnv*]
* @param activity [type:jobject]
* @param request_code [type:int32_t]
* @param result_code [type:int32_t]
* @param result [type:void*]
*/
typedef void (*OnActivityResult)(JNIEnv* env, jobject activity, int32_t request_code, int32_t result_code, void* result);
/*# register Android activity result callback
*
* Registers an activity result callback. Multiple listeners are allowed.
*
* @note [icon:android] Only available on Android
* @name RegisterOnActivityResultListener
* @param [type:dmAndroid::OnActivityResult] listener
*/
void RegisterOnActivityResultListener(OnActivityResult listener);
/*# unregister Android activity result callback
*
* Unregisters an activity result callback
*
* @note [icon:android] Only available on Android
* @name UnregisterOnActivityResultListener
* @param [type:dmAndroid::OnActivityResult] listener
*/
void UnregisterOnActivityResultListener(OnActivityResult listener);
/*# OnActivityCreate callback typedef
*
* onCreate callback function type.
* Used with RegisterOnActivityCreateListener() and UnregisterOnActivityCreateListener()
*
* @typedef
* @name OnActivityCreate
* @param env [type:JNIEnv*]
* @param activity [type:jobject]
*/
typedef void (*OnActivityCreate)(JNIEnv* env, jobject activity);
/*# register Android onCreate callback
*
* Registers an onCreate callback. Multiple listeners are allowed.
*
* @note [icon:android] Only available on Android
* @name RegisterOnActivityCreateListener
* @param [type:dmAndroid::OnActivityCreate] listener
*/
void RegisterOnActivityCreateListener(OnActivityCreate listener);
/*# unregister Android onCreate callback
*
* Unregisters an onCreate callback
*
* @note [icon:android] Only available on Android
* @name UnregisterOnActivityCreateListener
* @param [type:dmAndroid::OnActivityCreate] listener
*/
void UnregisterOnActivityCreateListener(OnActivityCreate listener);
} // namespace dmAndroid
#endif // ANDROID
#endif // DMSDK_ANDROID_H