mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-01-13 00:04:19 +00:00
143 lines
4.6 KiB
C++
143 lines
4.6 KiB
C++
/*
|
|
==============================================================================
|
|
|
|
This file is part of the JUCE library.
|
|
Copyright (c) 2017 - ROLI Ltd.
|
|
|
|
JUCE is an open source library subject to commercial or open-source
|
|
licensing.
|
|
|
|
The code included in this file is provided under the terms of the ISC license
|
|
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
|
|
To use, copy, modify, and/or distribute this software for any purpose with or
|
|
without fee is hereby granted provided that the above copyright notice and
|
|
this permission notice appear in all copies.
|
|
|
|
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
|
|
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
|
|
DISCLAIMED.
|
|
|
|
==============================================================================
|
|
*/
|
|
|
|
//==============================================================================
|
|
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \
|
|
METHOD (constructor, "<init>", "()V") \
|
|
METHOD (post, "post", "(Ljava/lang/Runnable;)Z") \
|
|
|
|
DECLARE_JNI_CLASS (JNIHandler, "android/os/Handler");
|
|
#undef JNI_CLASS_MEMBERS
|
|
|
|
|
|
//==============================================================================
|
|
namespace Android
|
|
{
|
|
class Runnable : public juce::AndroidInterfaceImplementer
|
|
{
|
|
public:
|
|
virtual void run() = 0;
|
|
|
|
private:
|
|
jobject invoke (jobject proxy, jobject method, jobjectArray args) override
|
|
{
|
|
auto* env = getEnv();
|
|
auto methodName = juce::juceString ((jstring) env->CallObjectMethod (method, Method.getName));
|
|
|
|
if (methodName == "run")
|
|
{
|
|
run();
|
|
return nullptr;
|
|
}
|
|
|
|
// invoke base class
|
|
return AndroidInterfaceImplementer::invoke (proxy, method, args);
|
|
}
|
|
};
|
|
|
|
struct Handler
|
|
{
|
|
juce_DeclareSingleton (Handler, false)
|
|
|
|
Handler() : nativeHandler (getEnv()->NewObject (JNIHandler, JNIHandler.constructor)) {}
|
|
|
|
bool post (Runnable* runnable)
|
|
{
|
|
return (getEnv()->CallBooleanMethod (nativeHandler.get(), JNIHandler.post,
|
|
CreateJavaInterface (runnable, "java/lang/Runnable").get()) != 0);
|
|
}
|
|
|
|
GlobalRef nativeHandler;
|
|
};
|
|
|
|
juce_ImplementSingleton (Handler);
|
|
}
|
|
|
|
//==============================================================================
|
|
void MessageManager::doPlatformSpecificInitialisation() { Android::Handler::getInstance(); }
|
|
void MessageManager::doPlatformSpecificShutdown() {}
|
|
|
|
//==============================================================================
|
|
bool MessageManager::dispatchNextMessageOnSystemQueue (const bool)
|
|
{
|
|
Logger::outputDebugString ("*** Modal loops are not possible in Android!! Exiting...");
|
|
exit (1);
|
|
|
|
return true;
|
|
}
|
|
|
|
//==============================================================================
|
|
struct AndroidMessageCallback : public Android::Runnable
|
|
{
|
|
AndroidMessageCallback (const MessageManager::MessageBase::Ptr& messageToDeliver)
|
|
: message (messageToDeliver)
|
|
{}
|
|
|
|
AndroidMessageCallback (MessageManager::MessageBase::Ptr && messageToDeliver)
|
|
: message (static_cast<MessageManager::MessageBase::Ptr&&> (messageToDeliver))
|
|
{}
|
|
|
|
void run() override
|
|
{
|
|
JUCE_TRY
|
|
{
|
|
message->messageCallback();
|
|
|
|
// delete the message already here as Java will only run the
|
|
// destructor of this runnable the next time the garbage
|
|
// collector kicks in.
|
|
message = nullptr;
|
|
}
|
|
JUCE_CATCH_EXCEPTION
|
|
}
|
|
|
|
MessageManager::MessageBase::Ptr message;
|
|
};
|
|
|
|
bool MessageManager::postMessageToSystemQueue (MessageManager::MessageBase* const message)
|
|
{
|
|
return Android::Handler::getInstance()->post (new AndroidMessageCallback (message));
|
|
}
|
|
//==============================================================================
|
|
void MessageManager::broadcastMessage (const String&)
|
|
{
|
|
}
|
|
|
|
void MessageManager::runDispatchLoop()
|
|
{
|
|
}
|
|
|
|
void MessageManager::stopDispatchLoop()
|
|
{
|
|
struct QuitCallback : public CallbackMessage
|
|
{
|
|
QuitCallback() {}
|
|
|
|
void messageCallback() override
|
|
{
|
|
android.activity.callVoidMethod (JuceAppActivity.finish);
|
|
}
|
|
};
|
|
|
|
(new QuitCallback())->post();
|
|
quitMessagePosted = true;
|
|
}
|