forked from joeferner/node-java
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathutils.h
More file actions
132 lines (111 loc) · 5.4 KB
/
Copy pathutils.h
File metadata and controls
132 lines (111 loc) · 5.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#ifndef _utils_h_
#define _utils_h_
#define BUILDING_NODE_EXTENSION 1
#include <v8.h>
#include <jni.h>
#include <list>
#include <vector>
#include <string>
#include <uv.h>
class Java;
typedef enum _jvalueType {
TYPE_VOID = 1,
TYPE_INT = 2,
TYPE_LONG = 3,
TYPE_OBJECT = 4,
TYPE_STRING = 5,
TYPE_BOOLEAN = 6,
TYPE_BYTE = 7,
TYPE_DOUBLE = 8,
TYPE_ARRAY = 9
} jvalueType;
struct DynamicProxyData {
unsigned int markerStart;
JNIEnv* env;
Java* java;
std::string interfaceName;
v8::Persistent<v8::Object> functions;
std::string methodName;
jobjectArray args;
jobject result;
int done;
unsigned int markerEnd;
};
#define LOCAL_FRAME_SIZE 500
#define DYNAMIC_PROXY_DATA_MARKER_START 0x12345678
#define DYNAMIC_PROXY_DATA_MARKER_END 0x87654321
int dynamicProxyDataVerify(DynamicProxyData* data);
void javaReflectionGetMethods(JNIEnv *env, jclass clazz, std::list<jobject>* methods);
void javaReflectionGetFields(JNIEnv *env, jclass clazz, std::list<jobject>* fields);
std::string javaToString(JNIEnv *env, jstring str);
std::string javaObjectToString(JNIEnv *env, jobject obj);
JNIEnv* javaAttachCurrentThread(JavaVM* jvm);
void javaDetachCurrentThread(JavaVM* jvm);
jvalueType javaGetType(JNIEnv *env, jclass type);
jobjectArray v8ToJava(JNIEnv* env, const v8::Arguments& args, int start, int end);
jobject v8ToJava(JNIEnv* env, v8::Local<v8::Value> arg);
v8::Handle<v8::Value> javaExceptionToV8(JNIEnv* env, const std::string& alternateMessage);
v8::Handle<v8::Value> javaExceptionToV8(JNIEnv* env, jthrowable ex, const std::string& alternateMessage);
v8::Handle<v8::Value> javaArrayToV8(Java* java, JNIEnv* env, jobjectArray objArray);
v8::Handle<v8::Value> javaToV8(Java* java, JNIEnv* env, jobject obj);
jobjectArray javaObjectArrayToClasses(JNIEnv *env, jobjectArray objs);
jobject longToJavaLongObj(JNIEnv *env, long l);
jclass javaFindClass(JNIEnv* env, std::string& className);
jobject javaFindField(JNIEnv* env, jclass clazz, std::string& fieldName);
jobject javaFindMethod(JNIEnv *env, jclass clazz, std::string& methodName, jobjectArray methodArgs);
jobject javaFindConstructor(JNIEnv *env, jclass clazz, jobjectArray methodArgs);
#define UNUSED_VARIABLE(var) var = var;
#define ARGS_FRONT_OBJECT(ARGNAME) \
if(args.Length() < argsStart+1 || !args[argsStart]->IsObject()) { \
std::ostringstream errStr; \
errStr << "Argument " << (argsStart+1) << " must be an object"; \
return ThrowException(v8::Exception::TypeError(v8::String::New(errStr.str().c_str()))); \
} \
v8::Local<v8::Object> ARGNAME = v8::Local<v8::Object>::Cast(args[argsStart]); \
argsStart++;
#define ARGS_FRONT_STRING(ARGNAME) \
if(args.Length() < argsStart+1 || !args[argsStart]->IsString()) { \
std::ostringstream errStr; \
errStr << "Argument " << (argsStart+1) << " must be a string"; \
return ThrowException(v8::Exception::TypeError(v8::String::New(errStr.str().c_str()))); \
} \
v8::Local<v8::String> _##ARGNAME##_obj = v8::Local<v8::String>::Cast(args[argsStart]); \
v8::String::AsciiValue _##ARGNAME##_val(_##ARGNAME##_obj); \
std::string ARGNAME = *_##ARGNAME##_val; \
argsStart++;
#define ARGS_FRONT_CLASSNAME() ARGS_FRONT_STRING(className)
#define ARGS_BACK_CALLBACK() \
bool callbackProvided; \
v8::Handle<v8::Value> callback; \
if(args[args.Length()-1]->IsFunction()) { \
callback = args[argsEnd-1]; \
argsEnd--; \
callbackProvided = true; \
} else { \
callback = v8::Null(); \
callbackProvided = false; \
}
#define EXCEPTION_CALL_CALLBACK(STRBUILDER) \
std::ostringstream errStr; \
errStr << STRBUILDER; \
v8::Handle<v8::Value> error = javaExceptionToV8(env, errStr.str()); \
v8::Handle<v8::Value> argv[2]; \
argv[0] = error; \
argv[1] = v8::Undefined(); \
v8::Function::Cast(*callback)->Call(v8::Context::GetCurrent()->Global(), 2, argv);
#define END_CALLBACK_FUNCTION(MSG) \
if(callbackProvided) { \
return v8::Undefined(); \
} else { \
std::ostringstream str; \
str << MSG; \
return scope.Close(v8::String::New(str.str().c_str())); \
}
#define PUSH_LOCAL_JAVA_FRAME() \
env->PushLocalFrame(LOCAL_FRAME_SIZE);
#define POP_LOCAL_JAVA_FRAME() \
env->PopLocalFrame(NULL);
#define POP_LOCAL_JAVA_FRAME_AND_RETURN(r) \
env->PopLocalFrame(NULL); \
return r;
#endif