mirror of https://github.com/BOINC/boinc.git
156 lines
3.9 KiB
C
156 lines
3.9 KiB
C
|
/** @file util.h
|
||
|
*
|
||
|
* Utilities common for the producer and consumer side JNI libraries
|
||
|
*
|
||
|
* Author: Gábor Gombás
|
||
|
*/
|
||
|
|
||
|
#ifndef UTIL_H
|
||
|
#define UTIL_H
|
||
|
|
||
|
#include "jni_proto.h"
|
||
|
|
||
|
#ifndef __GNUC__
|
||
|
#define __attribute__((x))
|
||
|
#endif
|
||
|
|
||
|
#define G_GNUC_UNUSED __attribute__((__unused__))
|
||
|
#define G_GNUC_INTERNAL __attribute__((__visibility__("internal")))
|
||
|
#define G_GNUC_PRINTF(x, y) __attribute((__format__(__printf__, x, y)))
|
||
|
|
||
|
/**********************************************************************
|
||
|
* Data type definitions
|
||
|
*/
|
||
|
|
||
|
/* This is used to obey strict aliasing rules and shut up gcc warnings */
|
||
|
union getenvarg
|
||
|
{
|
||
|
JNIEnv *env;
|
||
|
void *ptr;
|
||
|
};
|
||
|
|
||
|
|
||
|
/**********************************************************************
|
||
|
* Constants
|
||
|
*/
|
||
|
|
||
|
/* Macros used for class definitions:
|
||
|
*
|
||
|
* CLASS_<cls> The fully qualified name of the class (using '/',
|
||
|
* not '.')
|
||
|
* CTOR_<cls> The signature of the class' constructor
|
||
|
* SIG_<cls>_<meth> The signature of method <meth> of class <cls>
|
||
|
*/
|
||
|
|
||
|
/* Native Java classes */
|
||
|
#define CLASS_ArrayList \
|
||
|
"java/util/ArrayList"
|
||
|
#define CTOR_ArrayList \
|
||
|
"(I)V"
|
||
|
#define SIG_ArrayList_add \
|
||
|
"(ILjava/lang/Object;)V"
|
||
|
#define CLASS_Boolean \
|
||
|
"java/lang/Boolean"
|
||
|
#define CTOR_Boolean \
|
||
|
"(Z)V"
|
||
|
#define SIG_Boolean_booleanValue \
|
||
|
"()Z"
|
||
|
#define SIG_Class_getName \
|
||
|
"()Ljava/lang/String;"
|
||
|
#define CLASS_ClassNotFoundException \
|
||
|
"java/lang/ClassNotFoundException"
|
||
|
#define CLASS_Double \
|
||
|
"java/lang/Double"
|
||
|
#define CTOR_Double \
|
||
|
"(D)V"
|
||
|
#define SIG_Double_doubleValue \
|
||
|
"()D"
|
||
|
#define CLASS_IllegalArgumentException \
|
||
|
"java/lang/IllegalArgumentException"
|
||
|
#define CLASS_Integer \
|
||
|
"java/lang/Integer"
|
||
|
#define CTOR_Integer \
|
||
|
"(I)V"
|
||
|
#define SIG_Integer_intValue \
|
||
|
"()I"
|
||
|
#define CLASS_Long \
|
||
|
"java/lang/Long"
|
||
|
#define CTOR_Long \
|
||
|
"(J)V"
|
||
|
#define SIG_Long_longValue \
|
||
|
"()J"
|
||
|
#define CLASS_NullPointerException \
|
||
|
"java/lang/NullPointerException"
|
||
|
#define CLASS_System \
|
||
|
"java/lang/System"
|
||
|
#define SIG_System_getProperty \
|
||
|
"(Ljava/lang/String;)Ljava/lang/String;"
|
||
|
|
||
|
/* Classes defined in package hu.sztaki.lpds.dc */
|
||
|
#define CLASS_ClientEvent \
|
||
|
"hu/sztaki/lpds/dc/client/Event"
|
||
|
#define CTOR_ClientEvent \
|
||
|
"(JI)V"
|
||
|
#define CLASS_ClientVersion \
|
||
|
"hu/sztaki/lpds/dc/client/Version"
|
||
|
#define SIG_ClientVersion_getVersion \
|
||
|
"()Ljava/lang/String;"
|
||
|
#define CLASS_DCException \
|
||
|
"hu/sztaki/lpds/dc/DCException"
|
||
|
#define CTOR_DCException \
|
||
|
"(ILjava/lang/String;)V"
|
||
|
#define CLASS_RuntimeDCException \
|
||
|
"hu/sztaki/lpds/dc/RuntimeDCException"
|
||
|
#define CTOR_RuntimeDCException \
|
||
|
"(Ljava/lang/String;Ljava/lang/Throwable;)V"
|
||
|
|
||
|
|
||
|
/* Debugging classes */
|
||
|
#define DBG_CONN (1 << 0)
|
||
|
#define DBG_EVENT (1 << 1)
|
||
|
#define DBG_EXCEPTION (1 << 2)
|
||
|
|
||
|
|
||
|
/**********************************************************************
|
||
|
* Macros
|
||
|
*/
|
||
|
|
||
|
#define RETURN_IF_EXCEPTION(env, x) do {\
|
||
|
if ((*(env))->ExceptionCheck(env)) \
|
||
|
return (x); \
|
||
|
} while (0)
|
||
|
|
||
|
#define GET_CTOR(env, name, cls, meth) \
|
||
|
get_constructor(env, CLASS_ ## name, CTOR_ ## name, cls, meth)
|
||
|
#define GET_METH(env, cls, clsname, methname) \
|
||
|
get_method_id(env, cls, G_STRINGIFY(methname), \
|
||
|
SIG_ ## clsname ## _ ## methname)
|
||
|
|
||
|
|
||
|
/**********************************************************************
|
||
|
* Prototypes
|
||
|
*/
|
||
|
|
||
|
void propagate_runtime(JNIEnv *env, const char *fmt, ...)
|
||
|
G_GNUC_PRINTF(2, 3) G_GNUC_INTERNAL;
|
||
|
void throw_exc(JNIEnv *env, const char *classname, const char *fmt, ...)
|
||
|
G_GNUC_PRINTF(3, 4) G_GNUC_INTERNAL;
|
||
|
void throw_dcexc(JNIEnv *env, int code, const char *fmt, ...)
|
||
|
G_GNUC_PRINTF(3, 4) G_GNUC_INTERNAL;
|
||
|
|
||
|
jclass find_class(JNIEnv *env, const char *classname) G_GNUC_INTERNAL;
|
||
|
int get_constructor(JNIEnv *env, const char *class, const char *args,
|
||
|
jclass *cls, jmethodID *meth) G_GNUC_INTERNAL;
|
||
|
jmethodID get_method_id(JNIEnv *env, jclass cls, const char *methodname,
|
||
|
const char *signature) G_GNUC_INTERNAL;
|
||
|
int parse_debug_options(JNIEnv *env) G_GNUC_INTERNAL;
|
||
|
|
||
|
|
||
|
/**********************************************************************
|
||
|
* Global variables
|
||
|
*/
|
||
|
|
||
|
extern unsigned jni_debug G_GNUC_INTERNAL;
|
||
|
|
||
|
#endif /* UTIL_H */
|