29 #ifndef JUCE_ANDROID_JNIHELPERS_H_INCLUDED
30 #define JUCE_ANDROID_JNIHELPERS_H_INCLUDED
32 #if ! (defined (JUCE_ANDROID_ACTIVITY_CLASSNAME) && defined (JUCE_ANDROID_ACTIVITY_CLASSPATH))
33 #error "The JUCE_ANDROID_ACTIVITY_CLASSNAME and JUCE_ANDROID_ACTIVITY_CLASSPATH macros must be set!"
44 inline explicit GlobalRef (jobject o) : obj (retain (o)) {}
45 inline GlobalRef (
const GlobalRef& other) : obj (retain (other.obj)) {}
52 getEnv()->DeleteGlobalRef (obj);
57 inline GlobalRef& operator= (
const GlobalRef& other)
59 jobject newObj = retain (other.obj);
67 inline jobject
get()
const noexcept {
return obj; }
70 #define DECLARE_CALL_TYPE_METHOD(returnType, typeName) \
71 returnType call##typeName##Method (jmethodID methodID, ... ) const \
74 va_start (args, methodID); \
75 returnType result = getEnv()->Call##typeName##MethodV (obj, methodID, args); \
89 #undef DECLARE_CALL_TYPE_METHOD
94 va_start (args, methodID);
95 getEnv()->CallVoidMethodV (obj, methodID, args);
103 static inline jobject retain (jobject obj)
105 return obj == 0 ? 0 :
getEnv()->NewGlobalRef (obj);
110 template <
typename JavaType>
121 getEnv()->DeleteLocalRef (obj);
126 jobject newObj = retain (other.obj);
133 inline JavaType
get()
const noexcept {
return obj; }
138 static JavaType retain (JavaType obj)
140 return obj == 0 ? 0 : (JavaType)
getEnv()->NewLocalRef (obj);
147 String juceString (JNIEnv* env, jstring s)
149 const char*
const utf8 = env->GetStringUTFChars (s,
nullptr);
151 const String result (utf8CP);
152 env->ReleaseStringUTFChars (s, utf8);
156 String juceString (jstring s)
158 return juceString (
getEnv(), s);
168 char utf8[8] = { 0 };
189 jmethodID
resolveMethod (JNIEnv*,
const char* methodName,
const char* params);
191 jfieldID
resolveField (JNIEnv*,
const char* fieldName,
const char* signature);
195 const char*
const classPath;
199 void initialise (JNIEnv*);
200 void release (JNIEnv*);
206 #define CREATE_JNI_METHOD(methodID, stringName, params) methodID = resolveMethod (env, stringName, params);
207 #define CREATE_JNI_STATICMETHOD(methodID, stringName, params) methodID = resolveStaticMethod (env, stringName, params);
208 #define CREATE_JNI_FIELD(fieldID, stringName, signature) fieldID = resolveField (env, stringName, signature);
209 #define CREATE_JNI_STATICFIELD(fieldID, stringName, signature) fieldID = resolveStaticField (env, stringName, signature);
210 #define DECLARE_JNI_METHOD(methodID, stringName, params) jmethodID methodID;
211 #define DECLARE_JNI_FIELD(fieldID, stringName, signature) jfieldID fieldID;
213 #define DECLARE_JNI_CLASS(CppClassName, javaPath) \
214 class CppClassName ## _Class : public JNIClassBase \
217 CppClassName ## _Class() : JNIClassBase (javaPath) {} \
219 void initialiseFields (JNIEnv* env) \
221 JNI_CLASS_MEMBERS (CREATE_JNI_METHOD, CREATE_JNI_STATICMETHOD, CREATE_JNI_FIELD, CREATE_JNI_STATICFIELD); \
224 JNI_CLASS_MEMBERS (DECLARE_JNI_METHOD, DECLARE_JNI_METHOD, DECLARE_JNI_FIELD, DECLARE_JNI_FIELD); \
226 static CppClassName ## _Class CppClassName;
230 #if defined (__arm__)
231 #define JUCE_ARM_SOFT_FLOAT_ABI __attribute__ ((pcs("aapcs")))
233 #define JUCE_ARM_SOFT_FLOAT_ABI
236 #define JUCE_JNI_CALLBACK(className, methodName, returnType, params) \
237 extern "C" __attribute__ ((visibility("default"))) JUCE_ARM_SOFT_FLOAT_ABI returnType JUCE_JOIN_MACRO (JUCE_JOIN_MACRO (Java_, className), _ ## methodName) params
263 zeromem (threads,
sizeof (threads));
271 zeromem (threads,
sizeof (threads));
274 env->GetJavaVM (&jvm);
282 if (JNIEnv* env = attachToCurrentThread())
298 jvm->DetachCurrentThread();
305 const pthread_t thisThread = pthread_self();
309 for (
int i = 0; i < maxThreads; ++i)
311 if (threads[i] == thisThread)
321 if (JNIEnv* env =
get())
326 if (JNIEnv* env =
get())
329 if (JNIEnv* env = attachToCurrentThread())
337 enum { maxThreads = 32 };
338 pthread_t threads [maxThreads];
339 JNIEnv* envs [maxThreads];
342 JNIEnv* addEnv (JNIEnv* env)
noexcept
344 const pthread_t thisThread = pthread_self();
346 for (
int i = 0; i < maxThreads; ++i)
351 threads[i] = thisThread;
362 const pthread_t thisThread = pthread_self();
364 for (
int i = 0; i < maxThreads; ++i)
365 if (threads[i] == thisThread)
371 JNIEnv* attachToCurrentThread()
373 JNIEnv* env =
nullptr;
374 jvm->AttachCurrentThread (&env,
nullptr);
388 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \
389 METHOD (createNewView, "createNewView", "(ZJ)L" JUCE_ANDROID_ACTIVITY_CLASSPATH "$ComponentPeerView;") \
390 METHOD (deleteView, "deleteView", "(L" JUCE_ANDROID_ACTIVITY_CLASSPATH "$ComponentPeerView;)V") \
391 METHOD (deleteOpenGLView, "deleteOpenGLView", "(L" JUCE_ANDROID_ACTIVITY_CLASSPATH "$OpenGLView;)V") \
392 METHOD (postMessage, "postMessage", "(J)V") \
393 METHOD (finish, "finish", "()V") \
394 METHOD (getClipboardContent, "getClipboardContent", "()Ljava/lang/String;") \
395 METHOD (setClipboardContent, "setClipboardContent", "(Ljava/lang/String;)V") \
396 METHOD (excludeClipRegion, "excludeClipRegion", "(Landroid/graphics/Canvas;FFFF)V") \
397 METHOD (renderGlyph, "renderGlyph", "(CLandroid/graphics/Paint;Landroid/graphics/Matrix;Landroid/graphics/Rect;)[I") \
398 STATICMETHOD (createHTTPStream, "createHTTPStream", "(Ljava/lang/String;Z[BLjava/lang/String;I[ILjava/lang/StringBuffer;I)L" JUCE_ANDROID_ACTIVITY_CLASSPATH "$HTTPStream;") \
399 METHOD (launchURL, "launchURL", "(Ljava/lang/String;)V") \
400 METHOD (showMessageBox, "showMessageBox", "(Ljava/lang/String;Ljava/lang/String;J)V") \
401 METHOD (showOkCancelBox, "showOkCancelBox", "(Ljava/lang/String;Ljava/lang/String;J)V") \
402 METHOD (showYesNoCancelBox, "showYesNoCancelBox", "(Ljava/lang/String;Ljava/lang/String;J)V") \
403 STATICMETHOD (getLocaleValue, "getLocaleValue", "(Z)Ljava/lang/String;") \
404 METHOD (scanFile, "scanFile", "(Ljava/lang/String;)V") \
405 METHOD (getTypeFaceFromAsset, "getTypeFaceFromAsset", "(Ljava/lang/String;)Landroid/graphics/Typeface;") \
406 METHOD (getTypeFaceFromByteArray,"getTypeFaceFromByteArray","([B)Landroid/graphics/Typeface;")
409 #undef JNI_CLASS_MEMBERS
412 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \
413 METHOD (constructor, "<init>", "(I)V") \
414 METHOD (setColor, "setColor", "(I)V") \
415 METHOD (setAlpha, "setAlpha", "(I)V") \
416 METHOD (setTypeface, "setTypeface", "(Landroid/graphics/Typeface;)Landroid/graphics/Typeface;") \
417 METHOD (ascent, "ascent", "()F") \
418 METHOD (descent, "descent", "()F") \
419 METHOD (setTextSize, "setTextSize", "(F)V") \
420 METHOD (getTextWidths, "getTextWidths", "(Ljava/lang/String;[F)I") \
421 METHOD (setTextScaleX, "setTextScaleX", "(F)V") \
422 METHOD (getTextPath, "getTextPath", "(Ljava/lang/String;IIFFLandroid/graphics/Path;)V") \
423 METHOD (setShader, "setShader", "(Landroid/graphics/Shader;)Landroid/graphics/Shader;") \
426 #undef JNI_CLASS_MEMBERS
429 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \
430 METHOD (constructor, "<init>", "()V") \
431 METHOD (setValues, "setValues", "([F)V") \
434 #undef JNI_CLASS_MEMBERS
437 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \
438 METHOD (constructor, "<init>", "(IIII)V") \
439 FIELD (left, "left", "I") \
440 FIELD (right, "right", "I") \
441 FIELD (top, "top", "I") \
442 FIELD (bottom, "bottom", "I") \
445 #undef JNI_CLASS_MEMBERS
447 #endif // JUCE_ANDROID_JNIHELPERS_H_INCLUDED
GlobalRef(const GlobalRef &other)
Definition: juce_android_JNIHelpers.h:45
virtual ~JNIClassBase()
Definition: juce_android_SystemStats.cpp:34
void removeCurrentThreadFromCache()
Definition: juce_android_JNIHelpers.h:303
#define DECLARE_JNI_CLASS(CppClassName, javaPath)
Definition: juce_android_JNIHelpers.h:213
unsigned char Byte
Definition: zconf.h:274
ThreadLocalJNIEnvHolder() noexcept
Definition: juce_android_JNIHelpers.h:260
#define noexcept
Definition: juce_CompilerSupport.h:141
LocalRef(const LocalRef &other) noexcept
Definition: juce_android_JNIHelpers.h:115
String appFile
Definition: juce_android_JNIHelpers.h:250
Definition: juce_ScopedLock.h:59
void zeromem(void *memory, size_t numBytes) noexcept
Definition: juce_Memory.h:34
int screenHeight
Definition: juce_android_JNIHelpers.h:251
Definition: juce_CharPointer_UTF8.h:38
~AndroidThreadScope()
Definition: juce_android_JNIHelpers.h:384
jmethodID resolveStaticMethod(JNIEnv *, const char *methodName, const char *params)
Definition: juce_android_SystemStats.cpp:79
Definition: juce_SpinLock.h:46
jfieldID resolveStaticField(JNIEnv *, const char *fieldName, const char *signature)
Definition: juce_android_SystemStats.cpp:93
String appDataDir
Definition: juce_android_JNIHelpers.h:250
Definition: juce_String.h:43
int screenWidth
Definition: juce_android_JNIHelpers.h:251
static void initialiseAllClasses(JNIEnv *)
Definition: juce_android_SystemStats.cpp:58
void write(const juce_wchar charToWrite) noexcept
Definition: juce_CharPointer_UTF8.h:330
jfieldID resolveField(JNIEnv *, const char *fieldName, const char *signature)
Definition: juce_android_SystemStats.cpp:86
void initialise(JNIEnv *env)
Definition: juce_android_JNIHelpers.h:267
AndroidSystem android
Definition: juce_android_SystemStats.cpp:158
AndroidThreadScope()
Definition: juce_android_JNIHelpers.h:383
GlobalRef() noexcept
Definition: juce_android_JNIHelpers.h:43
LocalRef & operator=(const LocalRef &other)
Definition: juce_android_JNIHelpers.h:124
JNIEnv * getOrAttach() noexcept
Definition: juce_android_JNIHelpers.h:319
JNIEnv * getEnv() noexcept
Definition: juce_android_SystemStats.cpp:107
void detach() noexcept
Definition: juce_android_JNIHelpers.h:294
Definition: juce_android_JNIHelpers.h:240
void shutdown(JNIEnv *)
Definition: juce_android_SystemStats.cpp:147
#define DECLARE_CALL_TYPE_METHOD(returnType, typeName)
Definition: juce_android_JNIHelpers.h:70
~LocalRef()
Definition: juce_android_JNIHelpers.h:116
jmethodID resolveMethod(JNIEnv *, const char *methodName, const char *params)
Definition: juce_android_SystemStats.cpp:72
virtual void initialiseFields(JNIEnv *)=0
ThreadLocalJNIEnvHolder threadLocalJNIEnvHolder
Definition: juce_android_SystemStats.cpp:101
Definition: juce_Array.h:60
Definition: juce_android_JNIHelpers.h:111
Definition: juce_android_JNIHelpers.h:381
void initialise(JNIEnv *, jobject activity, jstring appFile, jstring appDataDir)
Definition: juce_android_SystemStats.cpp:131
Definition: juce_android_JNIHelpers.h:40
Definition: juce_android_JNIHelpers.h:257
LocalRef(JavaType o) noexcept
Definition: juce_android_JNIHelpers.h:114
GlobalRef(jobject o)
Definition: juce_android_JNIHelpers.h:44
JNIClassBase(const char *classPath)
Definition: juce_android_SystemStats.cpp:29
~GlobalRef()
Definition: juce_android_JNIHelpers.h:46
int dpi
Definition: juce_android_JNIHelpers.h:251
void clear()
Definition: juce_android_JNIHelpers.h:118
void callVoidMethod(jmethodID methodID,...) const
Definition: juce_android_JNIHelpers.h:91
Definition: juce_android_JNIHelpers.h:175
void clear()
Definition: juce_android_JNIHelpers.h:48
wchar_t juce_wchar
Definition: juce_CharacterFunctions.h:49
CharPointer_UTF8 toUTF8() const
Definition: juce_String.cpp:2057
static void releaseAllClasses(JNIEnv *)
Definition: juce_android_SystemStats.cpp:65
JNIEnv * attach() noexcept
Definition: juce_android_JNIHelpers.h:278
AndroidSystem()
Definition: juce_android_SystemStats.cpp:127
GlobalRef activity
Definition: juce_android_JNIHelpers.h:249