/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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 _IGNITE_JNI_JAVA
#define _IGNITE_JNI_JAVA

#include <stdint.h>

#include <jni.h>

#include "ignite/common/common.h"

namespace ignite
{
    namespace jni
    {
        namespace java
        {
            /* Handlers for callbacks from Java. */
            typedef int64_t(JNICALL *CacheStoreCreateHandler)(void* target, int64_t memPtr);
            typedef int(JNICALL *CacheStoreInvokeHandler)(void* target, int64_t objPtr, int64_t memPtr);
            typedef void(JNICALL *CacheStoreDestroyHandler)(void* target, int64_t objPtr);
            typedef int64_t(JNICALL *CacheStoreSessionCreateHandler)(void* target, int64_t storePtr);

            typedef int64_t(JNICALL *CacheEntryFilterCreateHandler)(void* target, int64_t memPtr);
            typedef int(JNICALL *CacheEntryFilterApplyHandler)(void* target, int64_t ptr, int64_t memPtr);
            typedef void(JNICALL *CacheEntryFilterDestroyHandler)(void* target, int64_t ptr);

            typedef void(JNICALL *CacheInvokeHandler)(void* target, int64_t inMemPtr, int64_t outMemPtr);

            typedef void(JNICALL *ComputeTaskMapHandler)(void* target, int64_t taskPtr, int64_t inMemPtr, int64_t outMemPtr);
            typedef int(JNICALL *ComputeTaskJobResultHandler)(void* target, int64_t taskPtr, int64_t jobPtr, int64_t memPtr);
            typedef void(JNICALL *ComputeTaskReduceHandler)(void* target, int64_t taskPtr);
            typedef void(JNICALL *ComputeTaskCompleteHandler)(void* target, int64_t taskPtr, int64_t memPtr);
            typedef int(JNICALL *ComputeJobSerializeHandler)(void* target, int64_t jobPtr, int64_t memPtr);
            typedef int64_t(JNICALL *ComputeJobCreateHandler)(void* target, int64_t memPtr);
            typedef void(JNICALL *ComputeJobExecuteHandler)(void* target, int64_t jobPtr, int cancel, int64_t memPtr);
            typedef void(JNICALL *ComputeJobCancelHandler)(void* target, int64_t jobPtr);
            typedef void(JNICALL *ComputeJobDestroyHandler)(void* target, int64_t jobPtr);

            typedef void(JNICALL *ContinuousQueryListenerApplyHandler)(void* target, int64_t lsnrPtr, int64_t memPtr);
            typedef int64_t(JNICALL *ContinuousQueryFilterCreateHandler)(void* target, int64_t memPtr);
            typedef int(JNICALL *ContinuousQueryFilterApplyHandler)(void* target, int64_t filterPtr, int64_t memPtr);
            typedef void(JNICALL *ContinuousQueryFilterReleaseHandler)(void* target, int64_t filterPtr);

            typedef void(JNICALL *DataStreamerTopologyUpdateHandler)(void* target, int64_t ldrPtr, int64_t topVer, int topSize);
            typedef void(JNICALL *DataStreamerStreamReceiverInvokeHandler)(void* target, int64_t ptr, void* cache, int64_t memPtr, unsigned char keepPortable);

            typedef void(JNICALL *FutureByteResultHandler)(void* target, int64_t futAddr, int res);
            typedef void(JNICALL *FutureBoolResultHandler)(void* target, int64_t futAddr, int res);
            typedef void(JNICALL *FutureShortResultHandler)(void* target, int64_t futAddr, int res);
            typedef void(JNICALL *FutureCharResultHandler)(void* target, int64_t futAddr, int res);
            typedef void(JNICALL *FutureIntResultHandler)(void* target, int64_t futAddr, int res);
            typedef void(JNICALL *FutureFloatResultHandler)(void* target, int64_t futAddr, float res);
            typedef void(JNICALL *FutureLongResultHandler)(void* target, int64_t futAddr, int64_t res);
            typedef void(JNICALL *FutureDoubleResultHandler)(void* target, int64_t futAddr, double res);
            typedef void(JNICALL *FutureObjectResultHandler)(void* target, int64_t futAddr, int64_t memPtr);
            typedef void(JNICALL *FutureNullResultHandler)(void* target, int64_t futAddr);
            typedef void(JNICALL *FutureErrorHandler)(void* target, int64_t futAddr, int64_t memPtr);

            typedef void(JNICALL *LifecycleEventHandler)(void* target, int64_t ptr, int evt);

            typedef void(JNICALL *MemoryReallocateHandler)(void* target, int64_t memPtr, int cap);

            typedef int64_t(JNICALL *MessagingFilterCreateHandler)(void* target, int64_t memPtr);
            typedef int(JNICALL *MessagingFilterApplyHandler)(void* target, int64_t ptr, int64_t memPtr);
            typedef void(JNICALL *MessagingFilterDestroyHandler)(void* target, int64_t ptr);

            typedef int64_t(JNICALL *EventFilterCreateHandler)(void* target, int64_t memPtr);
            typedef int(JNICALL *EventFilterApplyHandler)(void* target, int64_t ptr, int64_t memPtr);
            typedef void(JNICALL *EventFilterDestroyHandler)(void* target, int64_t ptr);

            typedef int64_t(JNICALL *ServiceInitHandler)(void* target, int64_t memPtr);
            typedef void(JNICALL *ServiceExecuteHandler)(void* target, int64_t svcPtr, int64_t memPtr);
            typedef void(JNICALL *ServiceCancelHandler)(void* target, int64_t svcPtr, int64_t memPtr);
            typedef void(JNICALL *ServiceInvokeMethodHandler)(void* target, int64_t svcPtr, int64_t inMemPtr, int64_t outMemPtr);
            typedef int(JNICALL *ClusterNodeFilterApplyHandler)(void* target, int64_t memPtr);

            typedef int64_t(JNICALL *NodeInfoHandler)(void* target, int64_t memPtr);

            typedef void(JNICALL *OnStartHandler)(void* target, void* proc, int64_t memPtr);
            typedef void(JNICALL *OnStopHandler)(void* target);
            typedef void(JNICALL *ErrorHandler)(void* target, int errCode, const char* errClsChars, int errClsCharsLen, const char* errMsgChars, int errMsgCharsLen, const char* stackTraceChars, int stackTraceCharsLen, void* errData, int errDataLen);

            typedef int64_t(JNICALL *ExtensionCallbackInLongOutLongHandler)(void* target, int typ, int64_t arg1);
            typedef int64_t(JNICALL *ExtensionCallbackInLongLongOutLongHandler)(void* target, int typ, int64_t arg1, int64_t arg2);

            typedef void(JNICALL *OnClientDisconnectedHandler)(void* target);
            typedef void(JNICALL *OnClientReconnectedHandler)(void* target, unsigned char clusterRestarted);

            typedef int64_t(JNICALL *AffinityFunctionInitHandler)(void* target, int64_t memPtr, void* baseFunc);
            typedef int(JNICALL *AffinityFunctionPartitionHandler)(void* target, int64_t ptr, int64_t memPtr);
            typedef void(JNICALL *AffinityFunctionAssignPartitionsHandler)(void* target, int64_t ptr, int64_t inMemPtr, int64_t outMemPtr);
            typedef void(JNICALL *AffinityFunctionRemoveNodeHandler)(void* target, int64_t ptr, int64_t memPtr);
            typedef void(JNICALL *AffinityFunctionDestroyHandler)(void* target, int64_t ptr);

            typedef void(JNICALL *ConsoleWriteHandler)(const char* chars, int charsLen, unsigned char isErr);

            typedef void(JNICALL *LoggerLogHandler)(void* target, int level, const char* messageChars, int messageCharsLen, const char* categoryChars, int categoryCharsLen, const char* errorInfoChars, int errorInfoCharsLen, int64_t memPtr);
            typedef bool(JNICALL *LoggerIsLevelEnabledHandler)(void* target, int level);
            
            typedef int64_t(JNICALL *InLongOutLongHandler)(void* target, int type, int64_t val);
            typedef int64_t(JNICALL *InLongLongLongObjectOutLongHandler)(void* target, int type, int64_t val1, int64_t val2, int64_t val3, void* arg);

            /**
             * Is Java 9 or later is used.
             *
             * @return true if the Java 9 or later is in use.
             */
            bool IGNITE_IMPORT_EXPORT IsJava9OrLater();

            /**
             * JNI handlers holder.
             */
            struct JniHandlers {
                void* target;

                ErrorHandler error;

                LoggerLogHandler loggerLog;
                LoggerIsLevelEnabledHandler loggerIsLevelEnabled;

                InLongOutLongHandler inLongOutLong;
                InLongLongLongObjectOutLongHandler inLongLongLongObjectOutLong;
            };

            /**
             * JNI Java members.
             */
            struct JniJavaMembers {
                jclass c_Class;
                jmethodID m_Class_getName;

                jclass c_Throwable;
                jmethodID m_Throwable_getMessage;
                jmethodID m_Throwable_printStackTrace;

                jclass c_PlatformUtils;
                jmethodID m_PlatformUtils_getFullStackTrace;

                /**
                 * Constructor.
                 */
                void Initialize(JNIEnv* env);

                /**
                 * Destroy members releasing all allocated classes.
                 */
                void Destroy(JNIEnv* env);

                /**
                 * Write error information.
                 */
                bool WriteErrorInfo(JNIEnv* env, char** errClsName, int* errClsNameLen, char** errMsg, int* errMsgLen,
                    char** stackTrace, int* stackTraceLen);
            };

            /**
             * JNI members.
             */
            struct JniMembers {
                jclass c_IgniteException;

                jclass c_PlatformIgnition;
                jmethodID m_PlatformIgnition_start;
                jmethodID m_PlatformIgnition_instance;
                jmethodID m_PlatformIgnition_environmentPointer;
                jmethodID m_PlatformIgnition_stop;
                jmethodID m_PlatformIgnition_stopAll;

                jclass c_PlatformTarget;
                jmethodID m_PlatformTarget_inLongOutLong;
                jmethodID m_PlatformTarget_inStreamOutLong;
                jmethodID m_PlatformTarget_inStreamOutObject;
                jmethodID m_PlatformTarget_outStream;
                jmethodID m_PlatformTarget_outObject;
                jmethodID m_PlatformTarget_inStreamAsync;
                jmethodID m_PlatformTarget_inStreamOutObjectAsync;
                jmethodID m_PlatformTarget_inStreamOutStream;
                jmethodID m_PlatformTarget_inObjectStreamOutObjectStream;

                jclass c_PlatformUtils;
                jmethodID m_PlatformUtils_reallocate;
                jmethodID m_PlatformUtils_errData;

                /**
                 * Constructor.
                 */
                void Initialize(JNIEnv* env);

                /**
                 * Destroy members releasing all allocated classes.
                 */
                void Destroy(JNIEnv* env);
            };

            /**
             * JNI JVM wrapper.
             */
            class IGNITE_IMPORT_EXPORT JniJvm {
            public:
                /**
                 * Default constructor for uninitialized JVM.
                 */
                JniJvm();

                /**
                 * Constructor.
                 *
                 * @param jvm JVM.
                 * @param javaMembers Java members.
                 * @param members Members.
                 */
                JniJvm(JavaVM* jvm, JniJavaMembers javaMembers, JniMembers members);

                /**
                 * Get JVM.
                 *
                 * @param JVM.
                 */
                JavaVM* GetJvm();

                /**
                 * Get Java members.
                 *
                 * @param Java members.
                 */
                JniJavaMembers& GetJavaMembers();

                /**
                 * Get members.
                 *
                 * @param Members.
                 */
                JniMembers& GetMembers();
            private:
                /** JVM. */
                JavaVM* jvm;

                /** Java members. */
                JniJavaMembers javaMembers;

                /** Members. */
                JniMembers members;
            };

            /**
             * JNI error information.
             */
            struct IGNITE_IMPORT_EXPORT JniErrorInfo
            {
                int code;
                char* errCls;
                char* errMsg;

                /**
                 * Default constructor. Creates empty error info.
                 */
                JniErrorInfo();

                /**
                 * Constructor.
                 *
                 * @param code Code.
                 * @param errCls Error class.
                 * @param errMsg Error message.
                 */
                JniErrorInfo(int code, const char* errCls, const char* errMsg);

                /**
                 * Copy constructor.
                 *
                 * @param other Other instance.
                 */
                JniErrorInfo(const JniErrorInfo& other);

                /**
                 * Assignment operator overload.
                 *
                 * @param other Other instance.
                 * @return This instance.
                 */
                JniErrorInfo& operator=(const JniErrorInfo& other);

                /**
                 * Destructor.
                 */
                ~JniErrorInfo();
            };

            /**
             * Unmanaged context.
             */
            class IGNITE_IMPORT_EXPORT JniContext {
            public:
                static JniContext* Create(char** opts, int optsLen, JniHandlers hnds);
                static JniContext* Create(char** opts, int optsLen, JniHandlers hnds, JniErrorInfo* errInfo);
                static int Reallocate(int64_t memPtr, int cap);
                static void Detach();
                static void Release(jobject obj);
                static void SetConsoleHandler(ConsoleWriteHandler consoleHandler);
                static int RemoveConsoleHandler(ConsoleWriteHandler consoleHandler);

                void IgnitionStart(char* cfgPath, char* name, int factoryId, int64_t dataPtr);
                void IgnitionStart(char* cfgPath, char* name, int factoryId, int64_t dataPtr, JniErrorInfo* errInfo);
                int64_t IgnitionEnvironmentPointer(char* name);
                int64_t IgnitionEnvironmentPointer(char* name, JniErrorInfo* errInfo);
                bool IgnitionStop(char* name, bool cancel);
                bool IgnitionStop(char* name, bool cancel, JniErrorInfo* errInfo);
                void IgnitionStopAll(bool cancel);
                void IgnitionStopAll(bool cancel, JniErrorInfo* errInfo);
                
                int64_t TargetInLongOutLong(jobject obj, int type, int64_t memPtr, JniErrorInfo* errInfo = NULL);
                int64_t TargetInStreamOutLong(jobject obj, int type, int64_t memPtr, JniErrorInfo* errInfo = NULL);
                void TargetInStreamOutStream(jobject obj, int opType, int64_t inMemPtr, int64_t outMemPtr, JniErrorInfo* errInfo = NULL);
                jobject TargetInStreamOutObject(jobject obj, int type, int64_t memPtr, JniErrorInfo* errInfo = NULL);
                jobject TargetInObjectStreamOutObjectStream(jobject obj, int opType, void* arg, int64_t inMemPtr, int64_t outMemPtr, JniErrorInfo* errInfo = NULL);
                void TargetOutStream(jobject obj, int opType, int64_t memPtr, JniErrorInfo* errInfo = NULL);
                jobject TargetOutObject(jobject obj, int opType, JniErrorInfo* errInfo = NULL);
                void TargetInStreamAsync(jobject obj, int type, int64_t memPtr, JniErrorInfo* errInfo = NULL);
                jobject TargetInStreamOutObjectAsync(jobject obj, int type, int64_t memPtr, JniErrorInfo* errInfo = NULL);

                jobject CacheOutOpQueryCursor(jobject obj, int type, int64_t memPtr, JniErrorInfo* errInfo = NULL);
                jobject CacheOutOpContinuousQuery(jobject obj, int type, int64_t memPtr, JniErrorInfo* errInfo = NULL);

                jobject Acquire(jobject obj);

                void DestroyJvm();
                void ThrowToJava(char* errMsg);
            private:
                JniJvm* jvm;
                JniHandlers hnds;

                JniContext(JniJvm* jvm, JniHandlers hnds);

                JNIEnv* Attach();
                void ExceptionCheck(JNIEnv* env);
                void ExceptionCheck(JNIEnv* env, JniErrorInfo* errInfo);
                jobject LocalToGlobal(JNIEnv* env, jobject obj);
            };

            JNIEXPORT jlong JNICALL JniCacheStoreCreate(JNIEnv *env, jclass cls, jlong envPtr, jlong memPtr);
            JNIEXPORT jint JNICALL JniCacheStoreInvoke(JNIEnv *env, jclass cls, jlong envPtr, jlong objPtr, jlong memPtr);
            JNIEXPORT void JNICALL JniCacheStoreDestroy(JNIEnv *env, jclass cls, jlong envPtr, jlong objPtr);
            JNIEXPORT jlong JNICALL JniCacheStoreSessionCreate(JNIEnv *env, jclass cls, jlong envPtr, jlong storePtr);

            JNIEXPORT jlong JNICALL JniCacheEntryFilterCreate(JNIEnv *env, jclass cls, jlong envPtr, jlong memPtr);
            JNIEXPORT jint JNICALL JniCacheEntryFilterApply(JNIEnv *env, jclass cls, jlong envPtr, jlong objPtr, jlong memPtr);
            JNIEXPORT void JNICALL JniCacheEntryFilterDestroy(JNIEnv *env, jclass cls, jlong envPtr, jlong objPtr);

            JNIEXPORT void JNICALL JniCacheInvoke(JNIEnv *env, jclass cls, jlong envPtr, jlong inMemPtr, jlong outMemPtr);

            JNIEXPORT void JNICALL JniComputeTaskMap(JNIEnv *env, jclass cls, jlong envPtr, jlong taskPtr, jlong inMemPtr, jlong outMemPtr);
            JNIEXPORT jint JNICALL JniComputeTaskJobResult(JNIEnv *env, jclass cls, jlong envPtr, jlong taskPtr, jlong jobPtr, jlong memPtr);
            JNIEXPORT void JNICALL JniComputeTaskReduce(JNIEnv *env, jclass cls, jlong envPtr, jlong taskPtr);
            JNIEXPORT void JNICALL JniComputeTaskComplete(JNIEnv *env, jclass cls, jlong envPtr, jlong taskPtr, jlong memPtr);
            JNIEXPORT jint JNICALL JniComputeJobSerialize(JNIEnv *env, jclass cls, jlong envPtr, jlong jobPtr, jlong memPtr);
            JNIEXPORT jlong JNICALL JniComputeJobCreate(JNIEnv *env, jclass cls, jlong envPtr, jlong memPtr);
            JNIEXPORT void JNICALL JniComputeJobExecute(JNIEnv *env, jclass cls, jlong envPtr, jlong jobPtr, jint cancel, jlong memPtr);
            JNIEXPORT void JNICALL JniComputeJobCancel(JNIEnv *env, jclass cls, jlong envPtr, jlong jobPtr);
            JNIEXPORT void JNICALL JniComputeJobDestroy(JNIEnv *env, jclass cls, jlong envPtr, jlong jobPtr);

            JNIEXPORT void JNICALL JniContinuousQueryListenerApply(JNIEnv *env, jclass cls, jlong envPtr, jlong cbPtr, jlong memPtr);
            JNIEXPORT jlong JNICALL JniContinuousQueryFilterCreate(JNIEnv *env, jclass cls, jlong envPtr, jlong memPtr);
            JNIEXPORT jint JNICALL JniContinuousQueryFilterApply(JNIEnv *env, jclass cls, jlong envPtr, jlong filterPtr, jlong memPtr);
            JNIEXPORT void JNICALL JniContinuousQueryFilterRelease(JNIEnv *env, jclass cls, jlong envPtr, jlong filterPtr);

            JNIEXPORT void JNICALL JniDataStreamerTopologyUpdate(JNIEnv *env, jclass cls, jlong envPtr, jlong ldrPtr, jlong topVer, jint topSize);
            JNIEXPORT void JNICALL JniDataStreamerStreamReceiverInvoke(JNIEnv *env, jclass cls, jlong envPtr, jlong ptr, jobject cache, jlong memPtr, jboolean keepPortable);

            JNIEXPORT void JNICALL JniFutureByteResult(JNIEnv *env, jclass cls, jlong envPtr, jlong futPtr, jint res);
            JNIEXPORT void JNICALL JniFutureBoolResult(JNIEnv *env, jclass cls, jlong envPtr, jlong futPtr, jint res);
            JNIEXPORT void JNICALL JniFutureShortResult(JNIEnv *env, jclass cls, jlong envPtr, jlong futPtr, jint res);
            JNIEXPORT void JNICALL JniFutureCharResult(JNIEnv *env, jclass cls, jlong envPtr, jlong futPtr, jint res);
            JNIEXPORT void JNICALL JniFutureIntResult(JNIEnv *env, jclass cls, jlong envPtr, jlong futPtr, jint res);
            JNIEXPORT void JNICALL JniFutureFloatResult(JNIEnv *env, jclass cls, jlong envPtr, jlong futPtr, jfloat res);
            JNIEXPORT void JNICALL JniFutureLongResult(JNIEnv *env, jclass cls, jlong envPtr, jlong futPtr, jlong res);
            JNIEXPORT void JNICALL JniFutureDoubleResult(JNIEnv *env, jclass cls, jlong envPtr, jlong futPtr, jdouble res);
            JNIEXPORT void JNICALL JniFutureObjectResult(JNIEnv *env, jclass cls, jlong envPtr, jlong futPtr, jlong memPtr);
            JNIEXPORT void JNICALL JniFutureNullResult(JNIEnv *env, jclass cls, jlong envPtr, jlong futPtr);
            JNIEXPORT void JNICALL JniFutureError(JNIEnv *env, jclass cls, jlong envPtr, jlong futPtr, jlong memPtr);

            JNIEXPORT void JNICALL JniLifecycleEvent(JNIEnv *env, jclass cls, jlong envPtr, jlong ptr, jint evt);

            JNIEXPORT void JNICALL JniMemoryReallocate(JNIEnv *env, jclass cls, jlong envPtr, jlong memPtr, jint cap);

            JNIEXPORT jlong JNICALL JniMessagingFilterCreate(JNIEnv *env, jclass cls, jlong envPtr, jlong memPtr);
            JNIEXPORT jint JNICALL JniMessagingFilterApply(JNIEnv *env, jclass cls, jlong envPtr, jlong ptr, jlong memPtr);
            JNIEXPORT void JNICALL JniMessagingFilterDestroy(JNIEnv *env, jclass cls, jlong envPtr, jlong ptr);
            
            JNIEXPORT jlong JNICALL JniEventFilterCreate(JNIEnv *env, jclass cls, jlong envPtr, jlong memPtr);
            JNIEXPORT jint JNICALL JniEventFilterApply(JNIEnv *env, jclass cls, jlong envPtr, jlong ptr, jlong memPtr);
            JNIEXPORT void JNICALL JniEventFilterDestroy(JNIEnv *env, jclass cls, jlong envPtr, jlong ptr);

            JNIEXPORT jlong JNICALL JniServiceInit(JNIEnv *env, jclass cls, jlong envPtr, jlong memPtr);
            JNIEXPORT void JNICALL JniServiceExecute(JNIEnv *env, jclass cls, jlong envPtr, jlong svcPtr, jlong memPtr);
            JNIEXPORT void JNICALL JniServiceCancel(JNIEnv *env, jclass cls, jlong envPtr, jlong svcPtr, jlong memPtr);
            JNIEXPORT void JNICALL JniServiceInvokeMethod(JNIEnv *env, jclass cls, jlong envPtr, jlong svcPtr, jlong inMemPtr, jlong outMemPtr);
            JNIEXPORT jint JNICALL JniClusterNodeFilterApply(JNIEnv *env, jclass cls, jlong envPtr, jlong memPtr);

            JNIEXPORT jlong JNICALL JniNodeInfo(JNIEnv *env, jclass cls, jlong envPtr, jlong memPtr);

            JNIEXPORT void JNICALL JniOnStart(JNIEnv *env, jclass cls, jlong envPtr, jobject proc, jlong memPtr);
            JNIEXPORT void JNICALL JniOnStop(JNIEnv *env, jclass cls, jlong envPtr);

            JNIEXPORT jlong JNICALL JniExtensionCallbackInLongOutLong(JNIEnv *env, jclass cls, jlong envPtr, jint typ, jlong arg1);
            JNIEXPORT jlong JNICALL JniExtensionCallbackInLongLongOutLong(JNIEnv *env, jclass cls, jlong envPtr, jint typ, jlong arg1, jlong arg2);

            JNIEXPORT void JNICALL JniOnClientDisconnected(JNIEnv *env, jclass cls, jlong envPtr);
            JNIEXPORT void JNICALL JniOnClientReconnected(JNIEnv *env, jclass cls, jlong envPtr, jboolean clusterRestarted);

            JNIEXPORT jlong JNICALL JniAffinityFunctionInit(JNIEnv *env, jclass cls, jlong envPtr, jlong memPtr, jobject baseFunc);
            JNIEXPORT jint JNICALL JniAffinityFunctionPartition(JNIEnv *env, jclass cls, jlong envPtr, jlong ptr, jlong memPtr);
            JNIEXPORT void JNICALL JniAffinityFunctionAssignPartitions(JNIEnv *env, jclass cls, jlong envPtr, jlong ptr, jlong inMemPtr, jlong outMemPtr);
            JNIEXPORT void JNICALL JniAffinityFunctionRemoveNode(JNIEnv *env, jclass cls, jlong envPtr, jlong ptr, jlong memPtr);
            JNIEXPORT void JNICALL JniAffinityFunctionDestroy(JNIEnv *env, jclass cls, jlong envPtr, jlong ptr);

            JNIEXPORT void JNICALL JniConsoleWrite(JNIEnv *env, jclass cls, jstring str, jboolean isErr);

            JNIEXPORT void JNICALL JniLoggerLog(JNIEnv *env, jclass cls, jlong envPtr, jint level, jstring message, jstring category, jstring errorInfo, jlong memPtr);
            JNIEXPORT jboolean JNICALL JniLoggerIsLevelEnabled(JNIEnv *env, jclass cls, jlong envPtr, jint level);

            JNIEXPORT jlong JNICALL JniInLongOutLong(JNIEnv *env, jclass cls, jlong envPtr, jint type, jlong val);
            JNIEXPORT jlong JNICALL JniInLongLongLongObjectOutLong(JNIEnv *env, jclass cls, jlong envPtr, jint type, jlong val1, jlong val2, jlong val3, jobject arg);
        }
    }
}

#endif //_IGNITE_JNI_JAVA
