14 #ifndef JAVACLASS_BASE_H 15 #define 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;}
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() {
165 addObject<ArgRef<T> >();
166 return cast<ArgRef<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[0], 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 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)));
282 #pragma omit pack classdesc::Functional 283 #pragma omit unpack classdesc::Functional 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>
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));}
419 void javaClass_onbase(
javaClass_t& cl,
const string& d,T a)
456 using classdesc::javaClass;
Java classfile representation.
support for Java signatures
Definition: javaClass_base.h:259
Definition: javaClass_base.h:128
Definition: javaClass_base.h:401
Convert a C++ type to a Java JNI type.
Definition: javaClass_base.h:172
Handle the return value.
Definition: javaClass_base.h:161
Definition: function.h:70
Definition: javaClass_base.h:448
class to allow access to private members
Definition: classdesc_access.h:21
Definition: classdesc.h:626
helper for constructing null descriptors
Definition: classdesc.h:784
Definition: javaClass_base.h:248
class to allow access to private members
Definition: classdesc_access.h:22
Return::T (or ::type) is the return type of F
Definition: function.h:33
Definition: javaClass.h:676
Definition: javaClass_base.h:271
Definition: javaClass_base.h:77
Definition: javaClass_base.h:301
void addMethod(const std::string &method_name, const std::string &descriptor)
add a method
Definition: javaClass.h:699
Contains definitions related to classdesc functionality.
Definition: arrays.h:2514
Definition: pack_base.h:124
controlled template specialisation: stolen from boost::enable_if.
Definition: classdesc.h:249
base class for ArgRef
Definition: javaClass_base.h:63
Definition: classdesc.h:266
Definition: javaClass_base.h:340
Contains access_* structs, and nothing else. These structs are used to gain access to private members...
Definition: accessor.h:55