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 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399
|
/*****************************************************************************
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
See NOTICE file for details.
*****************************************************************************/
#ifndef _JP_JAVA_FRAME_H_
#define _JP_JAVA_FRAME_H_
/** A Java Frame represents a memory managed scope in which
* java objects can be manipulated.
*
* Any resources created within a Java frame will be automatically
* deallocated at when the frame falls out of scope unless captured
* by a global reference.
*
* This should be used around all entry points from python that
* call java code. Failure may lead to local references not being
* released. Methods will large numbers of local references
* should allocate a local frame. At most one local reference
* from a local frame can be kept. Addition must use global referencing.
*
* JavaFrames are created to hold a certain number of items in
* scope at time. They will grow automatically if more items are
* created, but this has overhead. For most cases the default
* will be fine. However, when working with an array in which
* the number of items in scope can be known in advance, it is
* good to size the frame appropriately.
*
* A JavaFrame should not be used in a destructor as it can
* throw. The most common use of JavaFrame is to delete a
* global reference. See the ReleaseGlobalReference for
* this purpose.
*/
static const int LOCAL_FRAME_DEFAULT = 8;
class JPContext;
class JPJavaFrame
{
JPContext* m_Context;
JNIEnv* m_Env;
bool m_Popped;
bool m_Outer;
private:
JPJavaFrame(JPContext* context, JNIEnv* env, int size, bool outer);
public:
/** Create a new JavaFrame when called from Python.
*
* This method will automatically attach the thread
* if it is not already attached.
*
* @param size determines how many objects can be
* created in this scope without additional overhead.
*
* @throws JPypeException if the jpype cannot
* acquire an env handle to work with jvm.
*/
static JPJavaFrame outer(JPContext* context, int size = LOCAL_FRAME_DEFAULT)
{
return {context, nullptr, size, true};
}
/** Create a new JavaFrame when called internal when
* there is an existing frame.
*
* @param size determines how many objects can be
* created in this scope without additional overhead.
*
* @throws JPypeException if the jpype cannot
* acquire an env handle to work with jvm.
*/
static JPJavaFrame inner(JPContext* context, int size = LOCAL_FRAME_DEFAULT)
{
return {context, nullptr, size, false};
}
/** Create a new JavaFrame when called from Java.
*
* The thread was attached by definition.
*
* @param size determines how many objects can be
* created in this scope without additional overhead.
*
* @throws JPypeException if the jpype cannot
* acquire an env handle to work with jvm.
*/
static JPJavaFrame external(JPContext* context, JNIEnv* env, int size = LOCAL_FRAME_DEFAULT)
{
return {context, env, size, false};
}
JPJavaFrame(const JPJavaFrame& frame);
/** Exit the local scope and clean up all java
* objects.
*
* Only the one local object passed to outer scope
* by the keep method will be kept alive.
*/
~JPJavaFrame();
void check();
/** Exit the local frame and keep a local reference to an object
*
* This must be called only once when the frame is about to leave
* scope. Any local references other than the one that is kept
* are destroyed. If the next line is not "return", you are using
* this incorrectly.
*
* Further calls to the frame will still suceed as we do not
* check for operation on a closed frame, but is not advised.
*/
jobject keep(jobject);
/** Create a new global reference to a java object.
*
* This java reference may be held in a class until the object is
* no longer needed. It should be deleted with DeleteGlobalRef
* or ReleaseGlobalRef.
*/
jobject NewGlobalRef(jobject obj);
/** Delete a global reference.
*/
void DeleteGlobalRef(jobject obj);
/** Create a new local reference.
*
* This is only used when promoting a WeakReference to
* a local reference.
*/
jobject NewLocalRef(jobject obj);
/** Prematurely delete a local reference.
*
* This is used when processing an array to keep
* the objects in scope from growing.
*/
void DeleteLocalRef(jobject obj);
jweak NewWeakGlobalRef(jobject obj);
void DeleteWeakGlobalRef(jweak obj);
JNIEnv* getEnv() const
{
return m_Env;
}
JPContext* getContext() const
{
return m_Context;
}
string toString(jobject o);
string toStringUTF8(jstring str);
bool equals(jobject o1, jobject o2);
jint hashCode(jobject o);
jobject collectRectangular(jarray obj);
jobject assemble(jobject dims, jobject parts);
jobject newArrayInstance(jclass c, jintArray dims);
jthrowable getCause(jthrowable th);
jstring getMessage(jthrowable th);
jint compareTo(jobject obj, jobject obj2);
/**
* Convert a UTF8 encoded string into Java.
*
* This returns a local reference.
* @param str
* @return
*/
jstring fromStringUTF8(const string& str);
jobject callMethod(jobject method, jobject obj, jobject args);
jobject toCharArray(jstring jstr);
string getFunctional(jclass c);
JPClass *findClass(jclass obj);
JPClass *findClassByName(const string& name);
JPClass *findClassForObject(jobject obj);
// not implemented
JPJavaFrame& operator= (const JPJavaFrame& frame) = delete;
private:
jint PushLocalFrame(jint);
jobject PopLocalFrame(jobject);
public:
bool ExceptionCheck();
void ExceptionDescribe();
void ExceptionClear();
jthrowable ExceptionOccurred();
jint ThrowNew(jclass clazz, const char* msg);
jint Throw(jthrowable th);
jobject NewDirectByteBuffer(void* address, jlong capacity);
/** NewObjectA */
jobject NewObjectA(jclass a0, jmethodID a1, jvalue* a2);
// Monitor
int MonitorEnter(jobject a0);
int MonitorExit(jobject a0);
jclass FindClass(const string& a0);
jclass DefineClass(const char* a0, jobject a1, const jbyte* a2, jsize a3);
jint RegisterNatives(jclass a0, const JNINativeMethod* a1, jint a2);
jboolean IsInstanceOf(jobject a0, jclass a1);
jboolean IsAssignableFrom(jclass a0, jclass a1);
jsize GetArrayLength(jarray a0);
jobject GetObjectArrayElement(jobjectArray a0, jsize a1);
jfieldID FromReflectedField(jobject a0);
jfieldID GetFieldID(jclass a0, const char* a1, const char* a2);
jfieldID GetStaticFieldID(jclass a0, const char* a1, const char* a2);
jmethodID FromReflectedMethod(jobject a0);
jmethodID GetMethodID(jclass a0, const char* a1, const char* a2);
jmethodID GetStaticMethodID(jclass a0, const char* a1, const char* a2);
// Void
void CallStaticVoidMethodA(jclass a0, jmethodID a1, jvalue* a2);
void CallVoidMethodA(jobject a0, jmethodID a1, jvalue* a2);
void CallNonvirtualVoidMethodA(jobject a0, jclass a1, jmethodID a2, jvalue* a3);
// Bool
jboolean GetStaticBooleanField(jclass clazz, jfieldID fid);
jboolean GetBooleanField(jobject clazz, jfieldID fid);
void SetStaticBooleanField(jclass clazz, jfieldID fid, jboolean val);
void SetBooleanField(jobject clazz, jfieldID fid, jboolean val);
jboolean CallStaticBooleanMethodA(jclass clazz, jmethodID mid, jvalue* val);
jboolean CallBooleanMethodA(jobject obj, jmethodID mid, jvalue* val);
jboolean CallNonvirtualBooleanMethodA(jobject obj, jclass claz, jmethodID mid, jvalue* val);
jbooleanArray NewBooleanArray(jsize len);
void SetBooleanArrayRegion(jbooleanArray array, jsize start, jsize len, jboolean* vals);
void GetBooleanArrayRegion(jbooleanArray array, jsize start, jsize len, jboolean* vals);
jboolean* GetBooleanArrayElements(jbooleanArray array, jboolean* isCopy);
void ReleaseBooleanArrayElements(jbooleanArray, jboolean* v, jint mode);
// Byte
jbyte GetStaticByteField(jclass clazz, jfieldID fid);
jbyte GetByteField(jobject clazz, jfieldID fid);
void SetStaticByteField(jclass clazz, jfieldID fid, jbyte val);
void SetByteField(jobject clazz, jfieldID fid, jbyte val);
jbyte CallStaticByteMethodA(jclass clazz, jmethodID mid, jvalue* val);
jbyte CallByteMethodA(jobject obj, jmethodID mid, jvalue* val);
jbyte CallNonvirtualByteMethodA(jobject obj, jclass claz, jmethodID mid, jvalue* val);
jbyteArray NewByteArray(jsize len);
void SetByteArrayRegion(jbyteArray array, jsize start, jsize len, jbyte* vals);
void GetByteArrayRegion(jbyteArray array, jsize start, jsize len, jbyte* vals);
jbyte* GetByteArrayElements(jbyteArray array, jboolean* isCopy);
void ReleaseByteArrayElements(jbyteArray, jbyte* v, jint mode);
// Char
jchar GetStaticCharField(jclass clazz, jfieldID fid);
jchar GetCharField(jobject clazz, jfieldID fid);
void SetStaticCharField(jclass clazz, jfieldID fid, jchar val);
void SetCharField(jobject clazz, jfieldID fid, jchar val);
jchar CallStaticCharMethodA(jclass clazz, jmethodID mid, jvalue* val);
jchar CallCharMethodA(jobject obj, jmethodID mid, jvalue* val);
jchar CallNonvirtualCharMethodA(jobject obj, jclass claz, jmethodID mid, jvalue* val);
jcharArray NewCharArray(jsize len);
void SetCharArrayRegion(jcharArray array, jsize start, jsize len, jchar* vals);
void GetCharArrayRegion(jcharArray array, jsize start, jsize len, jchar* vals);
jchar* GetCharArrayElements(jcharArray array, jboolean* isCopy);
void ReleaseCharArrayElements(jcharArray, jchar* v, jint mode);
// Short
jshort GetStaticShortField(jclass clazz, jfieldID fid);
jshort GetShortField(jobject clazz, jfieldID fid);
void SetStaticShortField(jclass clazz, jfieldID fid, jshort val);
void SetShortField(jobject clazz, jfieldID fid, jshort val);
jshort CallStaticShortMethodA(jclass clazz, jmethodID mid, jvalue* val);
jshort CallShortMethodA(jobject obj, jmethodID mid, jvalue* val);
jshort CallNonvirtualShortMethodA(jobject obj, jclass claz, jmethodID mid, jvalue* val);
jshortArray NewShortArray(jsize len);
void SetShortArrayRegion(jshortArray array, jsize start, jsize len, jshort* vals);
void GetShortArrayRegion(jshortArray array, jsize start, jsize len, jshort* vals);
jshort* GetShortArrayElements(jshortArray array, jboolean* isCopy);
void ReleaseShortArrayElements(jshortArray, jshort* v, jint mode);
// Integer
jint GetStaticIntField(jclass clazz, jfieldID fid);
jint GetIntField(jobject clazz, jfieldID fid);
void SetStaticIntField(jclass clazz, jfieldID fid, jint val);
void SetIntField(jobject clazz, jfieldID fid, jint val);
jint CallStaticIntMethodA(jclass clazz, jmethodID mid, jvalue* val);
jint CallIntMethodA(jobject obj, jmethodID mid, jvalue* val);
jint CallNonvirtualIntMethodA(jobject obj, jclass claz, jmethodID mid, jvalue* val);
jintArray NewIntArray(jsize len);
void SetIntArrayRegion(jintArray array, jsize start, jsize len, jint* vals);
void GetIntArrayRegion(jintArray array, jsize start, jsize len, jint* vals);
jint* GetIntArrayElements(jintArray array, jboolean* isCopy);
void ReleaseIntArrayElements(jintArray, jint* v, jint mode);
// Long
jlong GetStaticLongField(jclass clazz, jfieldID fid);
jlong GetLongField(jobject clazz, jfieldID fid);
void SetStaticLongField(jclass clazz, jfieldID fid, jlong val);
void SetLongField(jobject clazz, jfieldID fid, jlong val);
jlong CallStaticLongMethodA(jclass clazz, jmethodID mid, jvalue* val);
jlong CallLongMethodA(jobject obj, jmethodID mid, jvalue* val);
jlong CallNonvirtualLongMethodA(jobject obj, jclass claz, jmethodID mid, jvalue* val);
jfloat GetStaticFloatField(jclass clazz, jfieldID fid);
jlongArray NewLongArray(jsize len);
void SetLongArrayRegion(jlongArray array, jsize start, jsize len, jlong* vals);
void GetLongArrayRegion(jlongArray array, jsize start, jsize len, jlong* vals);
jlong* GetLongArrayElements(jlongArray array, jboolean* isCopy);
void ReleaseLongArrayElements(jlongArray, jlong* v, jint mode);
// Float
jfloat GetFloatField(jobject clazz, jfieldID fid);
void SetStaticFloatField(jclass clazz, jfieldID fid, jfloat val);
void SetFloatField(jobject clazz, jfieldID fid, jfloat val);
jfloat CallStaticFloatMethodA(jclass clazz, jmethodID mid, jvalue* val);
jfloat CallFloatMethodA(jobject obj, jmethodID mid, jvalue* val);
jfloat CallNonvirtualFloatMethodA(jobject obj, jclass claz, jmethodID mid, jvalue* val);
jfloatArray NewFloatArray(jsize len);
void SetFloatArrayRegion(jfloatArray array, jsize start, jsize len, jfloat* vals);
void GetFloatArrayRegion(jfloatArray array, jsize start, jsize len, jfloat* vals);
jfloat* GetFloatArrayElements(jfloatArray array, jboolean* isCopy);
void ReleaseFloatArrayElements(jfloatArray, jfloat* v, jint mode);
// Double
jdouble GetStaticDoubleField(jclass clazz, jfieldID fid);
jdouble GetDoubleField(jobject clazz, jfieldID fid);
void SetStaticDoubleField(jclass clazz, jfieldID fid, jdouble val);
void SetDoubleField(jobject clazz, jfieldID fid, jdouble val);
jdouble CallStaticDoubleMethodA(jclass clazz, jmethodID mid, jvalue* val);
jdouble CallDoubleMethodA(jobject obj, jmethodID mid, jvalue* val);
jdouble CallNonvirtualDoubleMethodA(jobject obj, jclass claz, jmethodID mid, jvalue* val);
jdoubleArray NewDoubleArray(jsize len);
void SetDoubleArrayRegion(jdoubleArray array, jsize start, jsize len, jdouble* vals);
void GetDoubleArrayRegion(jdoubleArray array, jsize start, jsize len, jdouble* vals);
jdouble* GetDoubleArrayElements(jdoubleArray array, jboolean* isCopy);
void ReleaseDoubleArrayElements(jdoubleArray, jdouble* v, jint mode);
// Object
jclass GetObjectClass(jobject obj);
jobject GetStaticObjectField(jclass clazz, jfieldID fid);
jobject GetObjectField(jobject clazz, jfieldID fid);
void SetStaticObjectField(jclass clazz, jfieldID fid, jobject val);
void SetObjectField(jobject clazz, jfieldID fid, jobject val);
jobject CallStaticObjectMethodA(jclass clazz, jmethodID mid, jvalue* val);
jobject CallObjectMethodA(jobject obj, jmethodID mid, jvalue* val);
jobject CallNonvirtualObjectMethodA(jobject obj, jclass claz, jmethodID mid, jvalue* val);
jobjectArray NewObjectArray(jsize a0, jclass a1, jobject a2);
void SetObjectArrayElement(jobjectArray a0, jsize a1, jobject a2);
// String
jstring NewStringUTF(const char* a0);
void* GetDirectBufferAddress(jobject obj);
jlong GetDirectBufferCapacity(jobject obj);
jboolean isBufferReadOnly(jobject obj);
jboolean orderBuffer(jobject obj);
jclass getClass(jobject obj);
/** This returns a UTF16 surogate coded UTF-8 string.
*/
const char* GetStringUTFChars(jstring a0, jboolean* a1);
void ReleaseStringUTFChars(jstring a0, const char* a1);
jsize GetStringUTFLength(jstring a0);
jboolean isPackage(const string& str);
jobject getPackage(const string& str);
jobject getPackageObject(jobject pkg, const string& str);
jarray getPackageContents(jobject pkg);
void newWrapper(JPClass* cls);
void registerRef(jobject obj, PyObject* hostRef);
void registerRef(jobject obj, void* ref, JCleanupHook cleanup);
void clearInterrupt(bool throws);
} ;
#endif // _JP_JAVA_FRAME_H_
|