14#ifndef CLASSDESC_JAVACLASS_BASE_H
15#define CLASSDESC_JAVACLASS_BASE_H
34 template <
class T>
const char* javaClassName();
35 template <>
inline const char* javaClassName<int>() {
return "java/lang/Integer";}
36 template <>
inline const char* javaClassName<float>() {
return "java/lang/Float";}
38 template <
class T>
T getJavaVal(JNIEnv *env, jobject o);
39 template <>
inline int getJavaVal<int>(JNIEnv *env, jobject o) {
40 return env->CallIntMethod(o,
41 env->GetMethodID(env->GetObjectClass(o),
"intValue",
"()I"));
43 template <>
inline float getJavaVal<float>(JNIEnv *env, jobject o) {
44 return env->CallFloatMethod(o,
45 env->GetMethodID(env->GetObjectClass(o),
"floatValue",
"()F"));
47 template <>
inline std::string getJavaVal<std::string>(JNIEnv *env,jobject o)
49 return std::string(env->GetStringUTFChars(
static_cast<jstring
>(o),NULL));
52 template <
class T>
T getJavaVal(jvalue v);
53 template <>
inline bool getJavaVal<bool>(jvalue v) {
return v.z;}
54 template <>
inline char getJavaVal<char>(jvalue v) {
return v.b;}
55 template <>
inline unsigned short getJavaVal<unsigned short>(jvalue v) {
return v.c;}
56 template <>
inline short getJavaVal<short>(jvalue v) {
return v.s;}
57 template <>
inline int getJavaVal<int>(jvalue v) {
return v.i;}
58 template <>
inline long getJavaVal<long>(jvalue v) {
return v.j;}
59 template <>
inline float getJavaVal<float>(jvalue v) {
return v.f;}
60 template <>
inline double getJavaVal<double>(jvalue v) {
return v.d;}
65 virtual jobject get_jobject(JNIEnv *env)
const=0;
66 virtual jint get_jint(JNIEnv *env)
const {
return 0;}
67 virtual jfloat get_jfloat(JNIEnv *env)
const {
return 0;}
77 class ArgRef:
virtual public Object<ArgRef<T>,ArgRef_base>
83 ArgRef(
const T& x): value(x) {}
84 jobject get_jobject(JNIEnv *env)
const {
85 jclass clss=env->FindClass(javaClassName<T>());
86 return env->NewObject(clss,
89 (std::string(
"(")+descriptor<T>()+
")V").c_str()),
92 jint get_jint(JNIEnv *env)
const {
return jint(value);}
93 jfloat get_jfloat(JNIEnv *env)
const {
return jfloat(value);}
95 T* getRef() {
return &value;}
99 class ArgRef<void>:
virtual public Object<ArgRef<void>,ArgRef_base>
102 jobject get_jobject(JNIEnv *env)
const {
return NULL;}
103 void* getRef() {
return NULL;}
107#pragma omit pack classdesc::ArgRef
108#pragma omit unpack classdesc::ArgRef
109#pragma omit javaClass classdesc::ArgRef
110#pragma omit javaClass classdesc::ArgRef_base
135 Arg(): env(NULL), is_jobject(
true) {val.l=NULL;}
136 Arg(JNIEnv *env, jobject
object): env(env), is_jobject(
true) {val.l=
object;}
138 Arg(JNIEnv *env, jbyte v): env(env), is_jobject(
false) {val.b=v;}
139 Arg(JNIEnv *env, jchar v): env(env), is_jobject(
false) {val.c=v;}
140 Arg(JNIEnv *env, jint v): env(env), is_jobject(
false) {val.i=v;}
141 Arg(JNIEnv *env, jlong v): env(env), is_jobject(
false) {val.j=v;}
142 Arg(JNIEnv *env, jfloat v): env(env), is_jobject(
false) {val.f=v;}
143 Arg(JNIEnv *env, jdouble v): env(env), is_jobject(
false) {val.d=v;}
145 template <
class T>
T get()
const {
147 return getJavaVal<T>(env,val.l);
149 return getJavaVal<T>(val);
153 operator float() {
return get<float>();}
154 operator int() {
return get<int>();}
155 operator std::string() {
return get<std::string>();}
164 template <
class T>
T* getRef() {
171 template <
class Jtype>
174 template <
class CppType>
175 static Jtype from(JNIEnv *env,
const CppType& x) {
return JNItype(x);}
183 template <
class CppType>
184 static jobject from(JNIEnv *env,
const CppType& x)
186 jclass cls=env->FindClass(
"ConcreteCppObject");
187 jmethodID constructor=env->GetMethodID(cls,
"<init>",
"()V");
188 jobject obj=env->NewObject(cls,constructor);
189 jfieldID fld=env->GetFieldID(cls,
"register",
"Ljava/lang/Object;");
190 env->SetObjectField(obj,fld,
reinterpret_cast<jobject
>(
new CppType(x)));
193 template <
class CppType>
194 static jobject from(JNIEnv *env, CppType& x)
196 jclass cls=env->FindClass(
"ConcreteCppObject");
197 jmethodID constructor=env->GetMethodID(cls,
"<init>",
"()V");
198 jobject obj=env->NewObject(cls,constructor);
199 jfieldID fld=env->GetFieldID(cls,
"register",
"Ljava/lang/Object;");
200 env->SetObjectField(obj,fld,
reinterpret_cast<jobject
>(&x));
209 static jstring from(JNIEnv *env,
const char* x)
211 std::vector<jchar> tmp(x, x+strlen(x));
212 return env->NewString(tmp.data(), strlen(x));
214 static jstring from(JNIEnv *env,
const std::string& x)
216 return from(env, x.c_str());
222#pragma omit pack classdesc::Arg
223#pragma omit unpack classdesc::Arg
248 class ArgVector:
public std::vector<Arg>
251 ArgVector(
size_t n=0): std::vector<Arg>(n) {}
252 ArgVector(JNIEnv* env, jobjectArray& args)
254 for (
size_t i=0; args && i<size_t(env->GetArrayLength(args)); ++i)
255 push_back(
classdesc::Arg(env, env->GetObjectArrayElement(args,i)));
271 class Functional:
public Object<Functional<F>, Functional_base>
275 Functional(
const F& f): f(f) {}
282#pragma omit pack classdesc::Functional
283#pragma omit unpack classdesc::Functional
301 struct javaClass_t:
public ClassFile
303 javaClass_t() {magic=0xCAFEBABE; minor_version=0; major_version=50;}
305 virtual void add_functor(
const std::string& name, Functional_ptr f,
306 const std::string& sig)
311#pragma omit javaClass classdesc::javaClass_t
314 template <
class C,
class M>
316 javaClass(
javaClass_t& cl,
const string& desc, C& obj, M mem)
319 std::string method_name(desc);
320 if (method_name.find(
'.')!=std::string::npos)
321 method_name=method_name.substr(method_name.rfind(
'.')+1);
322 cl.
addMethod(method_name, descriptor<M>());
325 cl.add_functor(std::string(desc),
333 template <
class T,
class B>
340 class getter_setter:
public Object<getter_setter<T>,Functional_base>
344 getter_setter(
T& m): m(m) {}
346 if (args.size()) m=args[0].get<
T>();
353#pragma omit pack classdesc::getter_setter
354#pragma omit unpack classdesc::getter_setter
355#pragma omit javaClass classdesc::object
356#pragma omit javaClass classdesc::Object
378 std::string desc1(desc), ivar_name, class_name;
379 std::string::size_type last_dot=desc1.rfind(
'.');
381 if (last_dot==std::string::npos)
385 ivar_name=desc1.substr(last_dot+1);
386 class_name=desc1.substr(0,last_dot);
388 cl.
addMethod(ivar_name, classdesc::descriptor<
T (*)(
T)>());
392 ivar_name[0]=toupper(ivar_name[0]);
393 cl.
addMethod(std::string(
"get")+ivar_name, descriptor<
T (*)()>());
394 cl.add_functor(class_name+
".get"+ivar_name,
getter_setter<T>(obj), descriptor<
T (*)()>());
395 cl.
addMethod(std::string(
"set")+ivar_name, descriptor<
void (*)(
T)>());
396 cl.add_functor(class_name+
".set"+ivar_name,
getter_setter<T>(obj), descriptor<
void (*)(
T)>());
401 struct is_leftOver {
static const bool value=!is_fundamental<T>::value;};
408 void javaClass(
javaClass_t& cl,
const string& d,
const T& a)
409 {javaClass(cl,d,
const_cast<T&
>(a));}
424 void javaClass_onbase(
javaClass_t& cl,
const string& d,
T a)
463using classdesc::javaClass;
Definition javaClass_base.h:249
Definition javaClass_base.h:129
Definition javaClass_base.h:272
Handle the return value.
Definition javaClass_base.h:162
Definition javaClass_base.h:341
Definition classdesc.h:923
Definition pack_base.h:138
poly addObject()
Definition poly.h:68
U & cast()
Definition poly.h:85
support for Java signatures
Java classfile representation.
Contains access_* structs, and nothing else. These structs are used to gain access to private members...
Definition classdesc_access.h:20
Contains definitions related to classdesc functionality.
base class for ArgRef
Definition javaClass_base.h:64
void addMethod(const std::string &method_name, const std::string &descriptor)
add a method
Definition javaClass.h:721
Definition javaClass_base.h:260
Convert a C++ type to a Java JNI type.
Definition javaClass_base.h:173
helper for constructing null descriptors
Definition classdesc.h:1106
Definition classdesc.h:299
controlled template specialisation: stolen from boost::enable_if.
Definition classdesc.h:282
Return::T (or ::type) is the return type of F
Definition function.h:45
Definition javaClass_base.h:401
Definition javaClass_base.h:302
Definition javaClass_base.h:456
class to allow access to private members
Definition classdesc_access.h:21
class to allow access to private members
Definition classdesc_access.h:22