/* ====================================================================
* 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.
* ====================================================================
*/
package org.apache.jcc;
public class PythonVM {
static protected PythonVM vm;
static {
System.loadLibrary("jcc");
}
/**
* Start the embedded Python interpreter. The specified
* program name and args are set into the Python variable sys.argv.
* This returns an instance of the Python VM; it may be called
* multiple times, and will return the same VM instance each time.
*
* @param programName the name of the Python program, typically
* /usr/bin/python. This is informational; the program is not
* actually executed.
* @param args additional arguments to be put into sys.argv.
* @return a singleton instance of PythonVM
*/
static public PythonVM start(String programName, String[] args)
{
if (vm == null)
{
vm = new PythonVM();
vm.init(programName, args);
}
return vm;
}
/**
* Start the embedded Python interpreter. The specified
* program name is set into the Python variable sys.argv[0].
* This returns an instance of the Python VM; it may be called
* multiple times, and will return the same VM instance each time.
*
* @param programName the name of the Python program, typically
* /usr/bin/python. This is informational; the program is not
* actually executed.
* @return a singleton instance of PythonVM
*/
static public PythonVM start(String programName)
{
return start(programName, null);
}
/**
* Obtain the PythonVM instance, or null if the Python VM
* has not yet been started.
*
* @return a singleton instance of PythonVM, or null
*/
static public PythonVM get()
{
return vm;
}
protected PythonVM()
{
}
protected native void init(String programName, String[] args);
/**
* Instantiate the specified Python class, and return the instance.
*
* @param moduleName the Python module the class is defined in
* @param className the Python class to instantiate.
* @return a handle on the Python instance.
*/
public native Object instantiate(String moduleName, String className)
throws PythonException;
/**
* Bump the Python thread state counter. Every thread should
* do this before calling into Python, to prevent the Python
* thread state from being inadvertently collected (and causing loss
* of thread-local variables)
*
* @return the Python thread state counter. A return value less
* than zero signals an error.
*/
public native int acquireThreadState();
/**
* Release the Python thread state counter. Every thread that has
* called acquireThreadState() should call this before
* terminating.
*
* @return the Python thread state counter. A return value less
* than zero signals an error.
*/
public native int releaseThreadState();
}