mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-01-23 01:44:22 +00:00
Minor fixes for mac compilation. Android stuff.
This commit is contained in:
parent
571a2626da
commit
08339c92e2
23 changed files with 1233 additions and 616 deletions
|
|
@ -107,11 +107,12 @@ BEGIN_JUCE_NAMESPACE
|
|||
JAVACLASS (rectClass, "android/graphics/Rect") \
|
||||
JAVACLASS (regionClass, "android/graphics/Region") \
|
||||
JAVACLASS (shaderClass, "android/graphics/Shader") \
|
||||
JAVACLASS (shaderTileModeClass, "android/graphics/Shader$TileMode") \
|
||||
JAVACLASS (linearGradientClass, "android/graphics/LinearGradient") \
|
||||
JAVACLASS (radialGradientClass, "android/graphics/RadialGradient") \
|
||||
|
||||
//==============================================================================
|
||||
#define JUCE_JNI_METHODS(METHOD, STATICMETHOD, FIELD) \
|
||||
#define JUCE_JNI_METHODS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \
|
||||
\
|
||||
STATICMETHOD (activityClass, printToConsole, "printToConsole", "(Ljava/lang/String;)V") \
|
||||
METHOD (activityClass, createNewView, "createNewView", "()Lcom/juce/ComponentPeerView;") \
|
||||
|
|
@ -153,8 +154,10 @@ BEGIN_JUCE_NAMESPACE
|
|||
METHOD (paintClass, paintClassConstructor, "<init>", "()V") \
|
||||
METHOD (paintClass, setColor, "setColor", "(I)V") \
|
||||
METHOD (paintClass, setShader, "setShader", "(Landroid/graphics/Shader;)Landroid/graphics/Shader;") \
|
||||
METHOD (paintClass, setAntiAlias, "setAntiAlias", "(Z)V") \
|
||||
\
|
||||
METHOD (shaderClass, setLocalMatrix, "setLocalMatrix", "(Landroid/graphics/Matrix;)V") \
|
||||
STATICFIELD (shaderTileModeClass, clampMode, "CLAMP", "Landroid/graphics/Shader$TileMode;") \
|
||||
\
|
||||
METHOD (pathClass, pathClassConstructor, "<init>", "()V") \
|
||||
METHOD (pathClass, moveTo, "moveTo", "(FF)V") \
|
||||
|
|
@ -180,24 +183,116 @@ BEGIN_JUCE_NAMESPACE
|
|||
METHOD (regionClass, regionUnion, "union", "(Landroid/graphics/Rect;)Z"); \
|
||||
|
||||
|
||||
//==============================================================================
|
||||
class ThreadLocalJNIEnvHolder
|
||||
{
|
||||
public:
|
||||
ThreadLocalJNIEnvHolder()
|
||||
: jvm (0)
|
||||
{
|
||||
zeromem (threads, sizeof (threads));
|
||||
zeromem (envs, sizeof (envs));
|
||||
}
|
||||
|
||||
void initialise (JNIEnv* env)
|
||||
{
|
||||
env->GetJavaVM (&jvm);
|
||||
addEnv (env);
|
||||
}
|
||||
|
||||
void attach()
|
||||
{
|
||||
JNIEnv* env = 0;
|
||||
jvm->AttachCurrentThread (&env, 0);
|
||||
|
||||
if (env != 0)
|
||||
addEnv (env);
|
||||
}
|
||||
|
||||
void detach()
|
||||
{
|
||||
jvm->DetachCurrentThread();
|
||||
|
||||
const pthread_t thisThread = pthread_self();
|
||||
|
||||
ScopedLock sl (addRemoveLock);
|
||||
for (int i = 0; i < maxThreads; ++i)
|
||||
if (threads[i] == thisThread)
|
||||
threads[i] = 0;
|
||||
}
|
||||
|
||||
JNIEnv* get() const throw()
|
||||
{
|
||||
const pthread_t thisThread = pthread_self();
|
||||
|
||||
for (int i = 0; i < maxThreads; ++i)
|
||||
if (threads[i] == thisThread)
|
||||
return envs[i];
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
enum { maxThreads = 16 };
|
||||
|
||||
private:
|
||||
JavaVM* jvm;
|
||||
pthread_t threads [maxThreads];
|
||||
JNIEnv* envs [maxThreads];
|
||||
CriticalSection addRemoveLock;
|
||||
|
||||
void addEnv (JNIEnv* env)
|
||||
{
|
||||
ScopedLock sl (addRemoveLock);
|
||||
|
||||
if (get() == 0)
|
||||
{
|
||||
const pthread_t thisThread = pthread_self();
|
||||
|
||||
for (int i = 0; i < maxThreads; ++i)
|
||||
{
|
||||
if (threads[i] == 0)
|
||||
{
|
||||
envs[i] = env;
|
||||
threads[i] = thisThread;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
jassertfalse; // too many threads!
|
||||
}
|
||||
};
|
||||
|
||||
static ThreadLocalJNIEnvHolder threadLocalJNIEnvHolder;
|
||||
|
||||
struct AndroidThreadScope
|
||||
{
|
||||
AndroidThreadScope() { threadLocalJNIEnvHolder.attach(); }
|
||||
~AndroidThreadScope() { threadLocalJNIEnvHolder.detach(); }
|
||||
};
|
||||
|
||||
static inline JNIEnv* getEnv() throw()
|
||||
{
|
||||
return threadLocalJNIEnvHolder.get();
|
||||
}
|
||||
|
||||
|
||||
//==============================================================================
|
||||
class GlobalRef
|
||||
{
|
||||
public:
|
||||
GlobalRef()
|
||||
: env (0), obj (0)
|
||||
inline GlobalRef() throw()
|
||||
: obj (0)
|
||||
{
|
||||
}
|
||||
|
||||
GlobalRef (JNIEnv* const env_, jobject obj_)
|
||||
: env (env_),
|
||||
obj (retain (env_, obj_))
|
||||
inline explicit GlobalRef (jobject obj_)
|
||||
: obj (retain (obj_))
|
||||
{
|
||||
}
|
||||
|
||||
GlobalRef (const GlobalRef& other)
|
||||
: env (other.env),
|
||||
obj (retain (other.env, other.obj))
|
||||
inline GlobalRef (const GlobalRef& other)
|
||||
: obj (retain (other.obj))
|
||||
{
|
||||
}
|
||||
|
||||
|
|
@ -206,28 +301,22 @@ public:
|
|||
clear();
|
||||
}
|
||||
|
||||
void clear()
|
||||
inline void clear()
|
||||
{
|
||||
if (env != 0)
|
||||
{
|
||||
env->DeleteGlobalRef (obj);
|
||||
env = 0;
|
||||
obj = 0;
|
||||
}
|
||||
if (obj != 0)
|
||||
getEnv()->DeleteGlobalRef (obj);
|
||||
}
|
||||
|
||||
GlobalRef& operator= (const GlobalRef& other)
|
||||
inline GlobalRef& operator= (const GlobalRef& other)
|
||||
{
|
||||
clear();
|
||||
env = other.env;
|
||||
obj = retain (env, other.obj);
|
||||
obj = retain (other.obj);
|
||||
return *this;
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
inline operator jobject() const throw() { return obj; }
|
||||
inline jobject get() const throw() { return obj; }
|
||||
inline JNIEnv* getEnv() const throw() { return env; }
|
||||
|
||||
//==============================================================================
|
||||
#define DECLARE_CALL_TYPE_METHOD(returnType, typeName) \
|
||||
|
|
@ -235,7 +324,7 @@ public:
|
|||
{ \
|
||||
va_list args; \
|
||||
va_start (args, methodID); \
|
||||
returnType result = env->Call##typeName##MethodV (obj, methodID, args); \
|
||||
returnType result = getEnv()->Call##typeName##MethodV (obj, methodID, args); \
|
||||
va_end (args); \
|
||||
return result; \
|
||||
}
|
||||
|
|
@ -255,33 +344,101 @@ public:
|
|||
{
|
||||
va_list args;
|
||||
va_start (args, methodID);
|
||||
env->CallVoidMethodV (obj, methodID, args);
|
||||
getEnv()->CallVoidMethodV (obj, methodID, args);
|
||||
va_end (args);
|
||||
}
|
||||
|
||||
private:
|
||||
//==============================================================================
|
||||
JNIEnv* env;
|
||||
jobject obj;
|
||||
|
||||
static jobject retain (JNIEnv* const env, jobject obj_)
|
||||
static inline jobject retain (jobject obj_)
|
||||
{
|
||||
return env == 0 ? 0 : env->NewGlobalRef (obj_);
|
||||
return obj_ == 0 ? 0 : getEnv()->NewGlobalRef (obj_);
|
||||
}
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
template <typename JavaType>
|
||||
class LocalRef
|
||||
{
|
||||
public:
|
||||
explicit inline LocalRef (JavaType obj_) throw()
|
||||
: obj (obj_)
|
||||
{
|
||||
}
|
||||
|
||||
inline LocalRef (const LocalRef& other) throw()
|
||||
: obj (retain (other.obj))
|
||||
{
|
||||
}
|
||||
|
||||
~LocalRef()
|
||||
{
|
||||
if (obj != 0)
|
||||
getEnv()->DeleteLocalRef (obj);
|
||||
}
|
||||
|
||||
LocalRef& operator= (const LocalRef& other)
|
||||
{
|
||||
if (obj != other.obj)
|
||||
{
|
||||
if (obj != 0)
|
||||
getEnv()->DeleteLocalRef (obj);
|
||||
|
||||
obj = retain (other.obj);
|
||||
}
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
inline operator JavaType() const throw() { return obj; }
|
||||
inline JavaType get() const throw() { return obj; }
|
||||
|
||||
private:
|
||||
JavaType obj;
|
||||
|
||||
static JavaType retain (JavaType obj_)
|
||||
{
|
||||
return obj_ == 0 ? 0 : (JavaType) getEnv()->NewLocalRef (obj_);
|
||||
}
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
static const String juceString (jstring s)
|
||||
{
|
||||
JNIEnv* env = getEnv();
|
||||
|
||||
jboolean isCopy;
|
||||
const char* const utf8 = env->GetStringUTFChars (s, &isCopy);
|
||||
CharPointer_UTF8 utf8CP (utf8);
|
||||
const String result (utf8CP);
|
||||
env->ReleaseStringUTFChars (s, utf8);
|
||||
return result;
|
||||
}
|
||||
|
||||
static const LocalRef<jstring> javaString (const String& s)
|
||||
{
|
||||
return LocalRef<jstring> (getEnv()->NewStringUTF (s.toUTF8()));
|
||||
}
|
||||
|
||||
|
||||
//==============================================================================
|
||||
class AndroidJavaCallbacks
|
||||
{
|
||||
public:
|
||||
AndroidJavaCallbacks() : env (0), screenWidth (0), screenHeight (0)
|
||||
AndroidJavaCallbacks() : screenWidth (0), screenHeight (0)
|
||||
{
|
||||
}
|
||||
|
||||
void initialise (JNIEnv* env_, jobject activity_, int screenWidth_, int screenHeight_)
|
||||
void initialise (JNIEnv* env, jobject activity_,
|
||||
jstring appFile_, jstring appDataDir_,
|
||||
int screenWidth_, int screenHeight_)
|
||||
{
|
||||
env = env_;
|
||||
activity = GlobalRef (env, activity_);
|
||||
threadLocalJNIEnvHolder.initialise (env);
|
||||
activity = GlobalRef (activity_);
|
||||
appFile = juceString (appFile_);
|
||||
appDataDir = juceString (appDataDir_);
|
||||
screenWidth = screenWidth_;
|
||||
screenHeight = screenHeight_;
|
||||
|
||||
|
|
@ -300,12 +457,17 @@ public:
|
|||
#define CREATE_JNI_FIELD(ownerClass, fieldID, stringName, signature) \
|
||||
fieldID = env->GetFieldID (ownerClass, stringName, signature); \
|
||||
jassert (fieldID != 0);
|
||||
JUCE_JNI_METHODS (CREATE_JNI_METHOD, CREATE_JNI_STATICMETHOD, CREATE_JNI_FIELD);
|
||||
#define CREATE_JNI_STATICFIELD(ownerClass, fieldID, stringName, signature) \
|
||||
fieldID = env->GetStaticFieldID (ownerClass, stringName, signature); \
|
||||
jassert (fieldID != 0);
|
||||
JUCE_JNI_METHODS (CREATE_JNI_METHOD, CREATE_JNI_STATICMETHOD, CREATE_JNI_FIELD, CREATE_JNI_STATICFIELD);
|
||||
#undef CREATE_JNI_METHOD
|
||||
}
|
||||
|
||||
void shutdown()
|
||||
{
|
||||
JNIEnv* env = getEnv();
|
||||
|
||||
if (env != 0)
|
||||
{
|
||||
#define RELEASE_JNI_CLASS(className, path) env->DeleteGlobalRef (className);
|
||||
|
|
@ -313,29 +475,12 @@ public:
|
|||
#undef RELEASE_JNI_CLASS
|
||||
|
||||
activity.clear();
|
||||
env = 0;
|
||||
}
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
const String juceString (jstring s) const
|
||||
{
|
||||
jboolean isCopy;
|
||||
const char* const utf8 = env->GetStringUTFChars (s, &isCopy);
|
||||
CharPointer_UTF8 utf8CP (utf8);
|
||||
const String result (utf8CP);
|
||||
env->ReleaseStringUTFChars (s, utf8);
|
||||
return result;
|
||||
}
|
||||
|
||||
jstring javaString (const String& s) const
|
||||
{
|
||||
return env->NewStringUTF (s.toUTF8());
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
JNIEnv* env;
|
||||
GlobalRef activity;
|
||||
String appFile, appDataDir;
|
||||
int screenWidth, screenHeight;
|
||||
|
||||
//==============================================================================
|
||||
|
|
@ -345,13 +490,12 @@ public:
|
|||
|
||||
#define DECLARE_JNI_METHOD(ownerClass, methodID, stringName, params) jmethodID methodID;
|
||||
#define DECLARE_JNI_FIELD(ownerClass, fieldID, stringName, signature) jfieldID fieldID;
|
||||
JUCE_JNI_METHODS (DECLARE_JNI_METHOD, DECLARE_JNI_METHOD, DECLARE_JNI_FIELD);
|
||||
JUCE_JNI_METHODS (DECLARE_JNI_METHOD, DECLARE_JNI_METHOD, DECLARE_JNI_FIELD, DECLARE_JNI_FIELD);
|
||||
#undef DECLARE_JNI_METHOD
|
||||
};
|
||||
|
||||
static AndroidJavaCallbacks android;
|
||||
|
||||
|
||||
//==============================================================================
|
||||
#define JUCE_INCLUDED_FILE 1
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue