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
|
/*****************************************************************************
Copyright 2004 Steve M�nard
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.
*****************************************************************************/
#ifndef _JPENV_H_
#define _JPENV_H_
/** Java method of managing local references.
*
* 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.
*/
static const int LOCAL_FRAME_DEFAULT=8;
class JPLocalFrame
{
bool popped;
public:
/** Create a new local frame with a minimum number of entries */
JPLocalFrame(int i=LOCAL_FRAME_DEFAULT);
/** Exit the local frame and keep a local reference to an object */
jobject keep(jobject);
/** Exit the local frame if get has not been called. */
~JPLocalFrame();
};
/**
* Simple tample class for managing host references.
*/
class JPCleaner
{
public :
JPCleaner();
virtual ~JPCleaner();
void add(HostRef* r);
void addAll(vector<HostRef*>& r);
void remove(HostRef* r);
void removeAll(vector<HostRef*>& r);
private :
vector<HostRef*> m_HostObjects;
};
template<typename T>
class JPMallocCleaner
{
public :
JPMallocCleaner(size_t size)
{
mData = (T*)malloc(sizeof(T)*size);
}
~JPMallocCleaner()
{
free(mData);
}
T& operator[](size_t ndx)
{
return mData[ndx];
}
T* borrow()
{
return mData;
}
private :
T* mData;
};
namespace JPEnv
{
/**
* Initialize the JPype subs-system. Does NOT load the JVM
*/
void init(HostEnvironment* hostEnv);
/**
* Load the JVM
* TODO : add the non-string parameters, for possible callbacks
*/
void loadJVM(const string& vmPath, char ignoreUnrecognized, const StringVector& args);
void attachJVM(const string& vmPath);
void attachCurrentThread();
void attachCurrentThreadAsDaemon();
bool isThreadAttached();
JPJavaEnv* getJava();
HostEnvironment* getHost();
/**
* Check if the JPype environment has been initialized
*/
bool isInitialized();
void registerRef(HostRef*, HostRef* targetRef);
}
#endif // _JPENV_H_
|