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);
66 inline operator jobject() const
noexcept {
return 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);
132 inline operator JavaType() const
noexcept {
return 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 };
181 inline operator jclass() const
noexcept {
return classRef; }
183 static void initialiseAllClasses (JNIEnv*);
184 static void releaseAllClasses (JNIEnv*);
187 virtual void initialiseFields (JNIEnv*) = 0;
189 jmethodID resolveMethod (JNIEnv*,
const char* methodName,
const char* params);
190 jmethodID resolveStaticMethod (JNIEnv*,
const char* methodName,
const char* params);
191 jfieldID resolveField (JNIEnv*,
const char* fieldName,
const char* signature);
192 jfieldID resolveStaticField (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 245 void initialise (JNIEnv*, jobject activity, jstring appFile, jstring appDataDir);
246 void shutdown (JNIEnv*);
263 zeromem (threads,
sizeof (threads));
271 zeromem (threads,
sizeof (threads));
274 env->GetJavaVM (&jvm);
282 if (JNIEnv* env = attachToCurrentThread())
298 jvm->DetachCurrentThread();
299 removeCurrentThreadFromCache();
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
void removeCurrentThreadFromCache()
Definition: juce_android_JNIHelpers.h:303
#define DECLARE_JNI_CLASS(CppClassName, javaPath)
Definition: juce_android_JNIHelpers.h:213
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
Definition: juce_CharPointer_UTF8.h:38
~AndroidThreadScope()
Definition: juce_android_JNIHelpers.h:384
Definition: juce_SpinLock.h:46
void callVoidMethod(jmethodID methodID,...) const
Definition: juce_android_JNIHelpers.h:91
Definition: juce_String.h:43
int screenWidth
Definition: juce_android_JNIHelpers.h:251
void write(const juce_wchar charToWrite) noexcept
Definition: juce_CharPointer_UTF8.h:330
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
CharPointer_UTF8 toUTF8() const
Definition: juce_String.cpp:2057
#define DECLARE_CALL_TYPE_METHOD(returnType, typeName)
Definition: juce_android_JNIHelpers.h:70
~LocalRef()
Definition: juce_android_JNIHelpers.h:116
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
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
~GlobalRef()
Definition: juce_android_JNIHelpers.h:46
void clear()
Definition: juce_android_JNIHelpers.h:118
Definition: juce_android_JNIHelpers.h:175
void clear()
Definition: juce_android_JNIHelpers.h:48
wchar_t juce_wchar
Definition: juce_CharacterFunctions.h:49
JNIEnv * attach() noexcept
Definition: juce_android_JNIHelpers.h:278
GlobalRef activity
Definition: juce_android_JNIHelpers.h:249