+\r
+#define JAVA_MAXINT (0x7fffffff)\r
+\r
+#define RUNTIME_EXCEPTION "java/lang/RuntimeException"\r
+#define ILLEGAL_ARGUMENT_EXCEPTION "java/lang/IllegalArgumentException"\r
+#define OBJECT_CLASS "java/lang/Object"\r
+#define STRING_CLASS "java/lang/String"\r
+#define MAP_CLASS "java/util/Map"\r
+#define SET_CLASS "java/util/Set"\r
+\r
+#define PACKAGE_PREFIX "org/simantics/pythonlink/"\r
+\r
+#define NDARRAY_CLASS (PACKAGE_PREFIX "NDArray")\r
+\r
+#define VARIANT_CLASS "org/simantics/databoard/binding/mutable/Variant"\r
+#define BINDINGS_CLASS "org/simantics/databoard/Bindings"\r
+#define BINDING_CLASS "org/simantics/databoard/binding/Binding"\r
+#define DATATYPE_CLASS "org/simantics/databoard/type/Datatype"\r
+\r
+#define BOOLEANTYPE_CLASS "org/simantics/databoard/type/BooleanType"\r
+#define BYTETYPE_CLASS "org/simantics/databoard/type/ByteType"\r
+#define INTEGERTYPE_CLASS "org/simantics/databoard/type/IntegerType"\r
+#define LONGTYPE_CLASS "org/simantics/databoard/type/LongType"\r
+#define FLOATTYPE_CLASS "org/simantics/databoard/type/FloatType"\r
+#define DOUBLETYPE_CLASS "org/simantics/databoard/type/DoubleType"\r
+#define STRINGTYPE_CLASS "org/simantics/databoard/type/StringType"\r
+#define RECORDTYPE_CLASS "org/simantics/databoard/type/RecordType"\r
+#define ARRAYTYPE_CLASS "org/simantics/databoard/type/ArrayType"\r
+#define MAPTYPE_CLASS "org/simantics/databoard/type/MapType"\r
+#define OPTIONALTYPE_CLASS "org/simantics/databoard/type/OptionalType"\r
+#define UNIONTYPE_CLASS "org/simantics/databoard/type/UnionType"\r
+#define VARIANTTYPE_CLASS "org/simantics/databoard/type/VariantType"\r
+\r
+#define BOOLEANBINDING_CLASS "org/simantics/databoard/binding/BooleanBinding"\r
+#define BYTEBINDING_CLASS "org/simantics/databoard/binding/ByteBinding"\r
+#define INTEGERBINDING_CLASS "org/simantics/databoard/binding/IntegerBinding"\r
+#define LONGBINDING_CLASS "org/simantics/databoard/binding/LongBinding"\r
+#define FLOATBINDING_CLASS "org/simantics/databoard/binding/FloatBinding"\r
+#define DOUBLEBINDING_CLASS "org/simantics/databoard/binding/DoubleBinding"\r
+#define STRINGBINDING_CLASS "org/simantics/databoard/binding/StringBinding"\r
+#define RECORDBINDING_CLASS "org/simantics/databoard/binding/RecordBinding"\r
+#define ARRAYBINDING_CLASS "org/simantics/databoard/binding/ArrayBinding"\r
+#define MAPBINDING_CLASS "org/simantics/databoard/binding/MapBinding"\r
+#define OPTIONALBINDING_CLASS "org/simantics/databoard/binding/OptionalBinding"\r
+#define UNIONBINDING_CLASS "org/simantics/databoard/binding/UnionBinding"\r
+#define VARIANTBINDING_CLASS "org/simantics/databoard/binding/VariantBinding"\r
+\r
+#define COMPONENT_CLASS "org/simantics/databoard/type/Component"\r
+#define TAGGEDOBJECT_CLASS "org/simantics/databoard/binding/mutable/TaggedObject"\r
+\r
+PyObject *getPythonBooleanList(JNIEnv *env, jbooleanArray value);\r
+PyObject *getPythonByteArray(JNIEnv *env, jbyteArray value);\r
+PyObject *getPythonIntegerList(JNIEnv *env, jintArray value);\r
+PyObject *getPythonLongList(JNIEnv *env, jlongArray value);\r
+PyObject *getPythonFloatList(JNIEnv *env, jfloatArray value);\r
+PyObject *getPythonDoubleList(JNIEnv *env, jdoubleArray value);\r
+\r
+PyObject *getPythonObject(JNIEnv *env, jobject object, jobject binding);\r
+\r
+PyObject *getPythonBooleanObject(JNIEnv *env, jobject object, jobject binding);\r
+PyObject *getPythonByteObject(JNIEnv *env, jobject object, jobject binding);\r
+PyObject *getPythonIntegerObject(JNIEnv *env, jobject object, jobject binding);\r
+PyObject *getPythonLongObject(JNIEnv *env, jobject object, jobject binding);\r
+PyObject *getPythonFloatObject(JNIEnv *env, jobject object, jobject binding);\r
+PyObject *getPythonDoubleObject(JNIEnv *env, jobject object, jobject binding);\r
+PyObject *getPythonRecordObject(JNIEnv *env, jobjectArray object, jobject binding);\r
+PyObject *getPythonArrayObject(JNIEnv *env, jobject object, jobject binding);\r
+PyObject *getPythonMapObject(JNIEnv *env, jobject object, jobject binding);\r
+PyObject *getPythonOptionalObject(JNIEnv *env, jobject object, jobject binding);\r
+PyObject *getPythonUnionObject(JNIEnv *env, jobject object, jobject binding);\r
+PyObject *getPythonVariantObject(JNIEnv *env, jobject object, jobject binding);\r
+\r
+void setPythonVariable(PyObject *module, PyObject *name, PyObject *value);\r
+\r
+jobject pythonBoolAsBooleanObject(JNIEnv *env, PyObject *value);\r
+jobject pythonLongAsLongObject(JNIEnv *env, PyObject *value);\r
+jobject pythonFloatAsDoubleObject(JNIEnv *env, PyObject *value);\r
+jobject pythonByteArrayAsByteArray(JNIEnv *env, PyObject *value);\r
+jstring pythonStringAsJavaString(JNIEnv *env, PyObject *string);\r
+jobjectArray pythonSequenceAsObjectArray(JNIEnv *env, PyObject *seq);\r
+jobjectArray pythonSequenceAsStringArray(JNIEnv *env, PyObject *list);\r
+jintArray pythonSequenceAsIntegerArray(JNIEnv *env, PyObject *list);\r
+jlongArray pythonSequenceAsLongArray(JNIEnv *env, PyObject *list);\r
+jdoubleArray pythonSequenceAsDoubleArray(JNIEnv *env, PyObject *list);\r
+jobject pythonDictionaryAsMap(JNIEnv *env, PyObject *dict);\r
+jobject pythonArrayAsNDArray(JNIEnv *env, PyArrayObject *array);\r
+jobject pythonObjectAsObject(JNIEnv *env, PyObject *value);\r
+\r