http://git-wip-us.apache.org/repos/asf/ignite/blob/b7450ef4/modules/platforms/cpp/jni/src/java.cpp
----------------------------------------------------------------------
diff --cc modules/platforms/cpp/jni/src/java.cpp
index d29943c,0000000..2ce5794
mode 100644,000000..100644
--- a/modules/platforms/cpp/jni/src/java.cpp
+++ b/modules/platforms/cpp/jni/src/java.cpp
@@@ -1,2782 -1,0 +1,2812 @@@
 +/*
 + * 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.
 + */
 +
 +#include <cstring>
 +#include <string>
 +#include <exception>
 +
 +#include "ignite/jni/utils.h"
 +#include "ignite/common/concurrent.h"
 +#include "ignite/jni/java.h"
 +
 +#define IGNITE_SAFE_PROC_NO_ARG(jniEnv, envPtr, type, field) { \
 +    JniHandlers* hnds = reinterpret_cast<JniHandlers*>(envPtr); \
 +    type hnd = hnds->field; \
 +    if (hnd) \
 +        hnd(hnds->target); \
 +    else \
 +        ThrowOnMissingHandler(jniEnv); \
 +}
 +
 +#define IGNITE_SAFE_PROC(jniEnv, envPtr, type, field, ...) { \
 +    JniHandlers* hnds = reinterpret_cast<JniHandlers*>(envPtr); \
 +    type hnd = hnds->field; \
 +    if (hnd) \
 +        hnd(hnds->target, __VA_ARGS__); \
 +    else \
 +        ThrowOnMissingHandler(jniEnv); \
 +}
 +
 +#define IGNITE_SAFE_FUNC(jniEnv, envPtr, type, field, ...) { \
 +    JniHandlers* hnds = reinterpret_cast<JniHandlers*>(envPtr); \
 +    type hnd = hnds->field; \
 +    if (hnd) \
 +        return hnd(hnds->target, __VA_ARGS__); \
 +    else \
 +    { \
 +        ThrowOnMissingHandler(jniEnv); \
 +        return 0; \
 +    }\
 +}
 +
 +using namespace ignite::java;
 +
 +namespace ignite
 +{
 +    namespace jni
 +    {
 +        namespace java
 +        {
 +            namespace gcc = ignite::common::concurrent;
 +
 +            /* --- Startup exception. --- */
 +            class JvmException : public std::exception {
 +                // No-op.
 +            };
 +
 +            /* --- JNI method definitions. --- */
 +            struct JniMethod {
 +                char* name;
 +                char* sign;
 +                bool isStatic;
 +
 +                JniMethod(const char* name, const char* sign, bool isStatic) {
 +                    this->name = const_cast<char*>(name);
 +                    this->sign = const_cast<char*>(sign);
 +                    this->isStatic = isStatic;
 +                }
 +            };
 +
 +            /**
 +             * Heloper function to copy characters.
 +             *
 +             * @param src Source.
 +             * @return Result.
 +             */
 +            char* CopyChars(const char* src)
 +            {
 +                if (src)
 +                {
 +                    size_t len = strlen(src);
 +                    char* dest = new char[len + 1];
 +                    strcpy(dest, src);
 +                    *(dest + len) = 0;
 +                    return dest;
 +                }
 +                else
 +                    return NULL;
 +            }
 +
 +            JniErrorInfo::JniErrorInfo() : code(IGNITE_JNI_ERR_SUCCESS), 
errCls(NULL), errMsg(NULL)
 +            {
 +                // No-op.
 +            }
 +
 +            JniErrorInfo::JniErrorInfo(int code, const char* errCls, const 
char* errMsg) : code(code)
 +            {
 +                this->errCls = CopyChars(errCls);
 +                this->errMsg = CopyChars(errMsg);
 +            }
 +
 +            JniErrorInfo::JniErrorInfo(const JniErrorInfo& other) : 
code(other.code)
 +            {
 +                this->errCls = CopyChars(other.errCls);
 +                this->errMsg = CopyChars(other.errMsg);
 +            }
 +
 +            JniErrorInfo& JniErrorInfo::operator=(const JniErrorInfo& other)
 +            {
 +                if (this != &other)
 +                {
 +                    // 1. Create new instance, exception could occur at this 
point.
 +                    JniErrorInfo tmp(other);
 +
 +                    // 2. Swap with temp.
 +                    int code0 = code;
 +                    char* errCls0 = errCls;
 +                    char* errMsg0 = errMsg;
 +
 +                    code = tmp.code;
 +                    errCls = tmp.errCls;
 +                    errMsg = tmp.errMsg;
 +
 +                    tmp.code = code0;
 +                    tmp.errCls = errCls0;
 +                    tmp.errMsg = errMsg0;
 +                }
 +
 +                return *this;
 +            }
 +
 +            JniErrorInfo::~JniErrorInfo()
 +            {
 +                if (errCls)
 +                    delete[] errCls;
 +
 +                if (errMsg)
 +                    delete[] errMsg;
 +            }
 +
 +            /**
 +             * Guard to ensure global reference cleanup.
 +             */
 +            class JniGlobalRefGuard
 +            {
 +            public:
 +                JniGlobalRefGuard(JNIEnv *e, jobject obj) : env(e), ref(obj)
 +                {
 +                    // No-op.
 +                }
 +
 +                ~JniGlobalRefGuard()
 +                {
 +                    env->DeleteGlobalRef(ref);
 +                }
 +
 +            private:
 +                /** Environment. */
 +                JNIEnv* env;
 +
 +                /** Target reference. */
 +                jobject ref;
 +
 +                IGNITE_NO_COPY_ASSIGNMENT(JniGlobalRefGuard)
 +            };
 +
 +            const char* C_THROWABLE = "java/lang/Throwable";
 +            JniMethod M_THROWABLE_GET_MESSAGE = JniMethod("getMessage", 
"()Ljava/lang/String;", false);
 +            JniMethod M_THROWABLE_PRINT_STACK_TRACE = 
JniMethod("printStackTrace", "()V", false);
 +
 +            const char* C_CLASS = "java/lang/Class";
 +            JniMethod M_CLASS_GET_NAME = JniMethod("getName", 
"()Ljava/lang/String;", false);
 +
 +            const char* C_IGNITE_EXCEPTION = 
"org/apache/ignite/IgniteException";
 +
 +            const char* C_PLATFORM_NO_CALLBACK_EXCEPTION = 
"org/apache/ignite/internal/processors/platform/PlatformNoCallbackException";
 +
 +            const char* C_PLATFORM_PROCESSOR = 
"org/apache/ignite/internal/processors/platform/PlatformProcessor";
 +            JniMethod M_PLATFORM_PROCESSOR_RELEASE_START = 
JniMethod("releaseStart", "()V", false);
 +            JniMethod M_PLATFORM_PROCESSOR_PROJECTION = 
JniMethod("projection", 
"()Lorg/apache/ignite/internal/processors/platform/PlatformTarget;", false);
 +            JniMethod M_PLATFORM_PROCESSOR_CACHE = JniMethod("cache", 
"(Ljava/lang/String;)Lorg/apache/ignite/internal/processors/platform/PlatformTarget;",
 false);
 +            JniMethod M_PLATFORM_PROCESSOR_CREATE_CACHE = 
JniMethod("createCache", 
"(Ljava/lang/String;)Lorg/apache/ignite/internal/processors/platform/PlatformTarget;",
 false);
 +            JniMethod M_PLATFORM_PROCESSOR_GET_OR_CREATE_CACHE = 
JniMethod("getOrCreateCache", 
"(Ljava/lang/String;)Lorg/apache/ignite/internal/processors/platform/PlatformTarget;",
 false);
 +            JniMethod M_PLATFORM_PROCESSOR_CREATE_CACHE_FROM_CONFIG = 
JniMethod("createCacheFromConfig", 
"(J)Lorg/apache/ignite/internal/processors/platform/PlatformTarget;", false);
 +            JniMethod M_PLATFORM_PROCESSOR_GET_OR_CREATE_CACHE_FROM_CONFIG = 
JniMethod("getOrCreateCacheFromConfig", 
"(J)Lorg/apache/ignite/internal/processors/platform/PlatformTarget;", false);
++            JniMethod M_PLATFORM_PROCESSOR_CREATE_NEAR_CACHE = 
JniMethod("createNearCache", 
"(Ljava/lang/String;J)Lorg/apache/ignite/internal/processors/platform/PlatformTarget;",
 false);
++            JniMethod M_PLATFORM_PROCESSOR_GET_OR_CREATE_NEAR_CACHE = 
JniMethod("getOrCreateNearCache", 
"(Ljava/lang/String;J)Lorg/apache/ignite/internal/processors/platform/PlatformTarget;",
 false);
 +            JniMethod M_PLATFORM_PROCESSOR_DESTROY_CACHE = 
JniMethod("destroyCache", "(Ljava/lang/String;)V", false);
 +            JniMethod M_PLATFORM_PROCESSOR_AFFINITY = JniMethod("affinity", 
"(Ljava/lang/String;)Lorg/apache/ignite/internal/processors/platform/PlatformTarget;",
 false);
 +            JniMethod M_PLATFORM_PROCESSOR_DATA_STREAMER = 
JniMethod("dataStreamer", 
"(Ljava/lang/String;Z)Lorg/apache/ignite/internal/processors/platform/PlatformTarget;",
 false);
 +            JniMethod M_PLATFORM_PROCESSOR_TRANSACTIONS = 
JniMethod("transactions", 
"()Lorg/apache/ignite/internal/processors/platform/PlatformTarget;", false);
 +            JniMethod M_PLATFORM_PROCESSOR_COMPUTE = JniMethod("compute", 
"(Lorg/apache/ignite/internal/processors/platform/PlatformTarget;)Lorg/apache/ignite/internal/processors/platform/PlatformTarget;",
 false);
 +            JniMethod M_PLATFORM_PROCESSOR_MESSAGE = JniMethod("message", 
"(Lorg/apache/ignite/internal/processors/platform/PlatformTarget;)Lorg/apache/ignite/internal/processors/platform/PlatformTarget;",
 false);
 +            JniMethod M_PLATFORM_PROCESSOR_EVENTS = JniMethod("events", 
"(Lorg/apache/ignite/internal/processors/platform/PlatformTarget;)Lorg/apache/ignite/internal/processors/platform/PlatformTarget;",
 false);
 +            JniMethod M_PLATFORM_PROCESSOR_SERVICES = JniMethod("services", 
"(Lorg/apache/ignite/internal/processors/platform/PlatformTarget;)Lorg/apache/ignite/internal/processors/platform/PlatformTarget;",
 false);
 +            JniMethod M_PLATFORM_PROCESSOR_EXTENSIONS = 
JniMethod("extensions", 
"()Lorg/apache/ignite/internal/processors/platform/PlatformTarget;", false);
 +            JniMethod M_PLATFORM_PROCESSOR_ATOMIC_LONG = 
JniMethod("atomicLong", 
"(Ljava/lang/String;JZ)Lorg/apache/ignite/internal/processors/platform/PlatformTarget;",
 false);
 +            JniMethod M_PLATFORM_PROCESSOR_ATOMIC_SEQUENCE = 
JniMethod("atomicSequence", 
"(Ljava/lang/String;JZ)Lorg/apache/ignite/internal/processors/platform/PlatformTarget;",
 false);
 +            JniMethod M_PLATFORM_PROCESSOR_ATOMIC_REFERENCE = 
JniMethod("atomicReference", 
"(Ljava/lang/String;JZ)Lorg/apache/ignite/internal/processors/platform/PlatformTarget;",
 false);            
 +            JniMethod M_PLATFORM_PROCESSOR_GET_IGNITE_CONFIGURATION = 
JniMethod("getIgniteConfiguration", "(J)V", false);
 +
 +            const char* C_PLATFORM_TARGET = 
"org/apache/ignite/internal/processors/platform/PlatformTarget";
 +            JniMethod M_PLATFORM_TARGET_IN_STREAM_OUT_LONG = 
JniMethod("inStreamOutLong", "(IJ)J", false);
 +            JniMethod M_PLATFORM_TARGET_IN_STREAM_OUT_OBJECT = 
JniMethod("inStreamOutObject", "(IJ)Ljava/lang/Object;", false);
 +            JniMethod M_PLATFORM_TARGET_IN_STREAM_OUT_STREAM = 
JniMethod("inStreamOutStream", "(IJJ)V", false);
 +            JniMethod M_PLATFORM_TARGET_IN_OBJECT_STREAM_OUT_STREAM = 
JniMethod("inObjectStreamOutStream", "(ILjava/lang/Object;JJ)V", false);
 +            JniMethod M_PLATFORM_TARGET_OUT_LONG = JniMethod("outLong", 
"(I)J", false);
 +            JniMethod M_PLATFORM_TARGET_OUT_STREAM = JniMethod("outStream", 
"(IJ)V", false);
 +            JniMethod M_PLATFORM_TARGET_OUT_OBJECT = JniMethod("outObject", 
"(I)Ljava/lang/Object;", false);
 +            JniMethod M_PLATFORM_TARGET_LISTEN_FUTURE = 
JniMethod("listenFuture", "(JI)V", false);
 +            JniMethod M_PLATFORM_TARGET_LISTEN_FOR_OPERATION = 
JniMethod("listenFutureForOperation", "(JII)V", false);
 +            JniMethod M_PLATFORM_TARGET_LISTEN_FUTURE_AND_GET = 
JniMethod("listenFutureAndGet", 
"(JI)Lorg/apache/ignite/internal/processors/platform/utils/PlatformListenable;",
 false);
 +            JniMethod M_PLATFORM_TARGET_LISTEN_FOR_OPERATION_AND_GET = 
JniMethod("listenFutureForOperationAndGet", 
"(JII)Lorg/apache/ignite/internal/processors/platform/utils/PlatformListenable;",
 false);
 +
 +            const char* C_PLATFORM_CLUSTER_GRP = 
"org/apache/ignite/internal/processors/platform/cluster/PlatformClusterGroup";
 +            JniMethod M_PLATFORM_CLUSTER_GRP_FOR_OTHERS = 
JniMethod("forOthers", 
"(Lorg/apache/ignite/internal/processors/platform/cluster/PlatformClusterGroup;)Lorg/apache/ignite/internal/processors/platform/cluster/PlatformClusterGroup;",
 false);
 +            JniMethod M_PLATFORM_CLUSTER_GRP_FOR_REMOTES = 
JniMethod("forRemotes", 
"()Lorg/apache/ignite/internal/processors/platform/cluster/PlatformClusterGroup;",
 false);
 +            JniMethod M_PLATFORM_CLUSTER_GRP_FOR_DAEMONS = 
JniMethod("forDaemons", 
"()Lorg/apache/ignite/internal/processors/platform/cluster/PlatformClusterGroup;",
 false);
 +            JniMethod M_PLATFORM_CLUSTER_GRP_FOR_RANDOM = 
JniMethod("forRandom", 
"()Lorg/apache/ignite/internal/processors/platform/cluster/PlatformClusterGroup;",
 false);
 +            JniMethod M_PLATFORM_CLUSTER_GRP_FOR_OLDEST = 
JniMethod("forOldest", 
"()Lorg/apache/ignite/internal/processors/platform/cluster/PlatformClusterGroup;",
 false);
 +            JniMethod M_PLATFORM_CLUSTER_GRP_FOR_YOUNGEST = 
JniMethod("forYoungest", 
"()Lorg/apache/ignite/internal/processors/platform/cluster/PlatformClusterGroup;",
 false);
 +            JniMethod M_PLATFORM_CLUSTER_GRP_RESET_METRICS = 
JniMethod("resetMetrics", "()V", false);
 +
 +            const char* C_PLATFORM_MESSAGING = 
"org/apache/ignite/internal/processors/platform/messaging/PlatformMessaging";
 +            JniMethod M_PLATFORM_MESSAGING_WITH_ASYNC = 
JniMethod("withAsync", 
"()Lorg/apache/ignite/internal/processors/platform/messaging/PlatformMessaging;",
 false);
 +
 +            const char* C_PLATFORM_COMPUTE = 
"org/apache/ignite/internal/processors/platform/compute/PlatformCompute";
 +            JniMethod M_PLATFORM_COMPUTE_WITH_NO_FAILOVER = 
JniMethod("withNoFailover", "()V", false);
 +            JniMethod M_PLATFORM_COMPUTE_WITH_TIMEOUT = 
JniMethod("withTimeout", "(J)V", false);
 +            JniMethod M_PLATFORM_COMPUTE_EXECUTE_NATIVE = 
JniMethod("executeNative", 
"(JJ)Lorg/apache/ignite/internal/processors/platform/utils/PlatformListenable;",
 false);
 +
 +            const char* C_PLATFORM_CACHE = 
"org/apache/ignite/internal/processors/platform/cache/PlatformCache";
 +            JniMethod M_PLATFORM_CACHE_WITH_SKIP_STORE = 
JniMethod("withSkipStore", 
"()Lorg/apache/ignite/internal/processors/platform/cache/PlatformCache;", 
false);
 +            JniMethod M_PLATFORM_CACHE_WITH_NO_RETRIES = 
JniMethod("withNoRetries", 
"()Lorg/apache/ignite/internal/processors/platform/cache/PlatformCache;", 
false);
 +            JniMethod M_PLATFORM_CACHE_WITH_EXPIRY_PLC = 
JniMethod("withExpiryPolicy", 
"(JJJ)Lorg/apache/ignite/internal/processors/platform/cache/PlatformCache;", 
false);
 +            JniMethod M_PLATFORM_CACHE_WITH_ASYNC = JniMethod("withAsync", 
"()Lorg/apache/ignite/internal/processors/platform/cache/PlatformCache;", 
false);
 +            JniMethod M_PLATFORM_CACHE_WITH_KEEP_PORTABLE = 
JniMethod("withKeepBinary", 
"()Lorg/apache/ignite/internal/processors/platform/cache/PlatformCache;", 
false);
 +            JniMethod M_PLATFORM_CACHE_CLEAR = JniMethod("clear", "()V", 
false);
 +            JniMethod M_PLATFORM_CACHE_REMOVE_ALL = JniMethod("removeAll", 
"()V", false);
 +            JniMethod M_PLATFORM_CACHE_ITERATOR = JniMethod("iterator", 
"()Lorg/apache/ignite/internal/processors/platform/cache/PlatformCacheIterator;",
 false);
 +            JniMethod M_PLATFORM_CACHE_LOCAL_ITERATOR = 
JniMethod("localIterator", 
"(I)Lorg/apache/ignite/internal/processors/platform/cache/PlatformCacheIterator;",
 false);
 +            JniMethod M_PLATFORM_CACHE_ENTER_LOCK = JniMethod("enterLock", 
"(J)V", false);
 +            JniMethod M_PLATFORM_CACHE_EXIT_LOCK = JniMethod("exitLock", 
"(J)V", false);
 +            JniMethod M_PLATFORM_CACHE_TRY_ENTER_LOCK = 
JniMethod("tryEnterLock", "(JJ)Z", false);
 +            JniMethod M_PLATFORM_CACHE_CLOSE_LOCK = JniMethod("closeLock", 
"(J)V", false);
 +            JniMethod M_PLATFORM_CACHE_REBALANCE = JniMethod("rebalance", 
"(J)V", false);
 +            JniMethod M_PLATFORM_CACHE_SIZE = JniMethod("size", "(IZ)I", 
false);
 +
 +            const char* C_PLATFORM_AFFINITY = 
"org/apache/ignite/internal/processors/platform/cache/affinity/PlatformAffinity";
 +            JniMethod C_PLATFORM_AFFINITY_PARTITIONS = 
JniMethod("partitions", "()I", false);
 +
 +            const char* C_PLATFORM_DATA_STREAMER = 
"org/apache/ignite/internal/processors/platform/datastreamer/PlatformDataStreamer";
 +            JniMethod M_PLATFORM_DATA_STREAMER_LISTEN_TOPOLOGY = 
JniMethod("listenTopology", "(J)V", false);
 +            JniMethod M_PLATFORM_DATA_STREAMER_GET_ALLOW_OVERWRITE = 
JniMethod("allowOverwrite", "()Z", false);
 +            JniMethod M_PLATFORM_DATA_STREAMER_SET_ALLOW_OVERWRITE = 
JniMethod("allowOverwrite", "(Z)V", false);
 +            JniMethod M_PLATFORM_DATA_STREAMER_GET_SKIP_STORE = 
JniMethod("skipStore", "()Z", false);
 +            JniMethod M_PLATFORM_DATA_STREAMER_SET_SKIP_STORE = 
JniMethod("skipStore", "(Z)V", false);
 +            JniMethod M_PLATFORM_DATA_STREAMER_GET_PER_NODE_BUFFER_SIZE = 
JniMethod("perNodeBufferSize", "()I", false);
 +            JniMethod M_PLATFORM_DATA_STREAMER_SET_PER_NODE_BUFFER_SIZE = 
JniMethod("perNodeBufferSize", "(I)V", false);
 +            JniMethod M_PLATFORM_DATA_STREAMER_GET_PER_NODE_PARALLEL_OPS = 
JniMethod("perNodeParallelOperations", "()I", false);
 +            JniMethod M_PLATFORM_DATA_STREAMER_SET_PER_NODE_PARALLEL_OPS = 
JniMethod("perNodeParallelOperations", "(I)V", false);
 +
 +            const char* C_PLATFORM_TRANSACTIONS = 
"org/apache/ignite/internal/processors/platform/transactions/PlatformTransactions";
 +            JniMethod M_PLATFORM_TRANSACTIONS_TX_START = JniMethod("txStart", 
"(IIJI)J", false);
 +            JniMethod M_PLATFORM_TRANSACTIONS_TX_COMMIT = 
JniMethod("txCommit", "(J)I", false);
 +            JniMethod M_PLATFORM_TRANSACTIONS_TX_ROLLBACK = 
JniMethod("txRollback", "(J)I", false);
 +            JniMethod M_PLATFORM_TRANSACTIONS_TX_COMMIT_ASYNC = 
JniMethod("txCommitAsync", "(JJ)V", false);
 +            JniMethod M_PLATFORM_TRANSACTIONS_TX_ROLLBACK_ASYNC = 
JniMethod("txRollbackAsync", "(JJ)V", false);
 +            JniMethod M_PLATFORM_TRANSACTIONS_TX_STATE = JniMethod("txState", 
"(J)I", false);
 +            JniMethod M_PLATFORM_TRANSACTIONS_TX_SET_ROLLBACK_ONLY = 
JniMethod("txSetRollbackOnly", "(J)Z", false);
 +            JniMethod M_PLATFORM_TRANSACTIONS_TX_CLOSE = JniMethod("txClose", 
"(J)I", false);
 +            JniMethod M_PLATFORM_TRANSACTIONS_RESET_METRICS = 
JniMethod("resetMetrics", "()V", false);
 +
 +            const char* C_PLATFORM_CACHE_STORE_CALLBACK = 
"org/apache/ignite/internal/processors/platform/cache/store/PlatformCacheStoreCallback";
 +            JniMethod M_PLATFORM_CACHE_STORE_CALLBACK_INVOKE = 
JniMethod("invoke", "(J)V", false);
 +
 +            const char* C_PLATFORM_CALLBACK_UTILS = 
"org/apache/ignite/internal/processors/platform/callback/PlatformCallbackUtils";
 +
 +            JniMethod M_PLATFORM_CALLBACK_UTILS_CACHE_STORE_CREATE = 
JniMethod("cacheStoreCreate", "(JJ)J", true);
 +            JniMethod M_PLATFORM_CALLBACK_UTILS_CACHE_STORE_INVOKE = 
JniMethod("cacheStoreInvoke", "(JJJLjava/lang/Object;)I", true);
 +            JniMethod M_PLATFORM_CALLBACK_UTILS_CACHE_STORE_DESTROY = 
JniMethod("cacheStoreDestroy", "(JJ)V", true);
 +            JniMethod M_PLATFORM_CALLBACK_UTILS_CACHE_STORE_SESSION_CREATE = 
JniMethod("cacheStoreSessionCreate", "(JJ)J", true);
 +
 +            JniMethod M_PLATFORM_CALLBACK_UTILS_CACHE_ENTRY_FILTER_CREATE = 
JniMethod("cacheEntryFilterCreate", "(JJ)J", true);
 +            JniMethod M_PLATFORM_CALLBACK_UTILS_CACHE_ENTRY_FILTER_APPLY = 
JniMethod("cacheEntryFilterApply", "(JJJ)I", true);
 +            JniMethod M_PLATFORM_CALLBACK_UTILS_CACHE_ENTRY_FILTER_DESTROY = 
JniMethod("cacheEntryFilterDestroy", "(JJ)V", true);
 +
 +            JniMethod M_PLATFORM_CALLBACK_UTILS_CACHE_INVOKE = 
JniMethod("cacheInvoke", "(JJJ)V", true);
 +
 +            JniMethod M_PLATFORM_CALLBACK_UTILS_COMPUTE_TASK_MAP = 
JniMethod("computeTaskMap", "(JJJJ)V", true);
 +            JniMethod M_PLATFORM_CALLBACK_UTILS_COMPUTE_TASK_JOB_RESULT = 
JniMethod("computeTaskJobResult", "(JJJJ)I", true);
 +            JniMethod M_PLATFORM_CALLBACK_UTILS_COMPUTE_TASK_REDUCE = 
JniMethod("computeTaskReduce", "(JJ)V", true);
 +            JniMethod M_PLATFORM_CALLBACK_UTILS_COMPUTE_TASK_COMPLETE = 
JniMethod("computeTaskComplete", "(JJJ)V", true);
 +            JniMethod M_PLATFORM_CALLBACK_UTILS_COMPUTE_JOB_SERIALIZE = 
JniMethod("computeJobSerialize", "(JJJ)I", true);
 +            JniMethod M_PLATFORM_CALLBACK_UTILS_COMPUTE_JOB_CREATE = 
JniMethod("computeJobCreate", "(JJ)J", true);
 +            JniMethod M_PLATFORM_CALLBACK_UTILS_COMPUTE_JOB_EXECUTE = 
JniMethod("computeJobExecute", "(JJIJ)V", true);
 +            JniMethod M_PLATFORM_CALLBACK_UTILS_COMPUTE_JOB_DESTROY = 
JniMethod("computeJobDestroy", "(JJ)V", true);
 +            JniMethod M_PLATFORM_CALLBACK_UTILS_COMPUTE_JOB_CANCEL = 
JniMethod("computeJobCancel", "(JJ)V", true);
 +
 +            JniMethod M_PLATFORM_CALLBACK_UTILS_CONTINUOUS_QUERY_LSNR_APPLY = 
JniMethod("continuousQueryListenerApply", "(JJJ)V", true);
 +            JniMethod 
M_PLATFORM_CALLBACK_UTILS_CONTINUOUS_QUERY_FILTER_CREATE = 
JniMethod("continuousQueryFilterCreate", "(JJ)J", true);
 +            JniMethod M_PLATFORM_CALLBACK_UTILS_CONTINUOUS_QUERY_FILTER_EVAL 
= JniMethod("continuousQueryFilterApply", "(JJJ)I", true);
 +            JniMethod 
M_PLATFORM_CALLBACK_UTILS_CONTINUOUS_QUERY_FILTER_RELEASE = 
JniMethod("continuousQueryFilterRelease", "(JJ)V", true);
 +
 +            JniMethod M_PLATFORM_CALLBACK_UTILS_DATA_STREAMER_TOPOLOGY_UPDATE 
= JniMethod("dataStreamerTopologyUpdate", "(JJJI)V", true);
 +            JniMethod 
M_PLATFORM_CALLBACK_UTILS_DATA_STREAMER_STREAM_RECEIVER_INVOKE = 
JniMethod("dataStreamerStreamReceiverInvoke", "(JJLjava/lang/Object;JZ)V", 
true);
 +
 +            JniMethod M_PLATFORM_CALLBACK_UTILS_FUTURE_BYTE_RES = 
JniMethod("futureByteResult", "(JJI)V", true);
 +            JniMethod M_PLATFORM_CALLBACK_UTILS_FUTURE_BOOL_RES = 
JniMethod("futureBoolResult", "(JJI)V", true);
 +            JniMethod M_PLATFORM_CALLBACK_UTILS_FUTURE_SHORT_RES = 
JniMethod("futureShortResult", "(JJI)V", true);
 +            JniMethod M_PLATFORM_CALLBACK_UTILS_FUTURE_CHAR_RES = 
JniMethod("futureCharResult", "(JJI)V", true);
 +            JniMethod M_PLATFORM_CALLBACK_UTILS_FUTURE_INT_RES = 
JniMethod("futureIntResult", "(JJI)V", true);
 +            JniMethod M_PLATFORM_CALLBACK_UTILS_FUTURE_FLOAT_RES = 
JniMethod("futureFloatResult", "(JJF)V", true);
 +            JniMethod M_PLATFORM_CALLBACK_UTILS_FUTURE_LONG_RES = 
JniMethod("futureLongResult", "(JJJ)V", true);
 +            JniMethod M_PLATFORM_CALLBACK_UTILS_FUTURE_DOUBLE_RES = 
JniMethod("futureDoubleResult", "(JJD)V", true);
 +            JniMethod M_PLATFORM_CALLBACK_UTILS_FUTURE_OBJ_RES = 
JniMethod("futureObjectResult", "(JJJ)V", true);
 +            JniMethod M_PLATFORM_CALLBACK_UTILS_FUTURE_NULL_RES = 
JniMethod("futureNullResult", "(JJ)V", true);
 +            JniMethod M_PLATFORM_CALLBACK_UTILS_FUTURE_ERR = 
JniMethod("futureError", "(JJJ)V", true);
 +
 +            JniMethod M_PLATFORM_CALLBACK_UTILS_LIFECYCLE_EVENT = 
JniMethod("lifecycleEvent", "(JJI)V", true);
 +
 +            JniMethod M_PLATFORM_CALLBACK_UTILS_MESSAGING_FILTER_CREATE = 
JniMethod("messagingFilterCreate", "(JJ)J", true);
 +            JniMethod M_PLATFORM_CALLBACK_UTILS_MESSAGING_FILTER_APPLY = 
JniMethod("messagingFilterApply", "(JJJ)I", true);
 +            JniMethod M_PLATFORM_CALLBACK_UTILS_MESSAGING_FILTER_DESTROY = 
JniMethod("messagingFilterDestroy", "(JJ)V", true);
 +
 +            JniMethod M_PLATFORM_CALLBACK_UTILS_EVENT_FILTER_CREATE = 
JniMethod("eventFilterCreate", "(JJ)J", true);
 +            JniMethod M_PLATFORM_CALLBACK_UTILS_EVENT_FILTER_APPLY = 
JniMethod("eventFilterApply", "(JJJ)I", true);
 +            JniMethod M_PLATFORM_CALLBACK_UTILS_EVENT_FILTER_DESTROY = 
JniMethod("eventFilterDestroy", "(JJ)V", true);
 +
 +            JniMethod M_PLATFORM_CALLBACK_UTILS_SERVICE_INIT = 
JniMethod("serviceInit", "(JJ)J", true);
 +            JniMethod M_PLATFORM_CALLBACK_UTILS_SERVICE_EXECUTE = 
JniMethod("serviceExecute", "(JJJ)V", true);
 +            JniMethod M_PLATFORM_CALLBACK_UTILS_SERVICE_CANCEL = 
JniMethod("serviceCancel", "(JJJ)V", true);
 +            JniMethod M_PLATFORM_CALLBACK_UTILS_SERVICE_INVOKE_METHOD = 
JniMethod("serviceInvokeMethod", "(JJJJ)V", true);
 +
 +            JniMethod M_PLATFORM_CALLBACK_UTILS_CLUSTER_NODE_FILTER_APPLY = 
JniMethod("clusterNodeFilterApply", "(JJ)I", true);
 +
 +            JniMethod M_PLATFORM_CALLBACK_UTILS_NODE_INFO = 
JniMethod("nodeInfo", "(JJ)V", true);
 +
 +            JniMethod M_PLATFORM_CALLBACK_UTILS_MEMORY_REALLOCATE = 
JniMethod("memoryReallocate", "(JJI)V", true);
 +
 +            JniMethod M_PLATFORM_CALLBACK_UTILS_ON_START = 
JniMethod("onStart", "(JLjava/lang/Object;J)V", true);
 +            JniMethod M_PLATFORM_CALLBACK_UTILS_ON_STOP = JniMethod("onStop", 
"(J)V", true);
 +
 +            JniMethod 
M_PLATFORM_CALLBACK_UTILS_EXTENSION_CALLBACK_IN_LONG_OUT_LONG = 
JniMethod("extensionCallbackInLongOutLong", "(JIJ)J", true);
 +            JniMethod 
M_PLATFORM_CALLBACK_UTILS_EXTENSION_CALLBACK_IN_LONG_LONG_OUT_LONG = 
JniMethod("extensionCallbackInLongLongOutLong", "(JIJJ)J", true);
 +
 +            JniMethod M_PLATFORM_CALLBACK_UTILS_ON_CLIENT_DISCONNECTED = 
JniMethod("onClientDisconnected", "(J)V", true);
 +            JniMethod M_PLATFORM_CALLBACK_UTILS_ON_CLIENT_RECONNECTED = 
JniMethod("onClientReconnected", "(JZ)V", true);
 +
 +            const char* C_PLATFORM_UTILS = 
"org/apache/ignite/internal/processors/platform/utils/PlatformUtils";
 +            JniMethod M_PLATFORM_UTILS_REALLOC = JniMethod("reallocate", 
"(JI)V", true);
 +            JniMethod M_PLATFORM_UTILS_ERR_DATA = JniMethod("errorData", 
"(Ljava/lang/Throwable;)[B", true);
 +
 +            const char* C_PLATFORM_IGNITION = 
"org/apache/ignite/internal/processors/platform/PlatformIgnition";
 +            JniMethod M_PLATFORM_IGNITION_START = JniMethod("start", 
"(Ljava/lang/String;Ljava/lang/String;IJJ)Lorg/apache/ignite/internal/processors/platform/PlatformProcessor;",
 true);
 +            JniMethod M_PLATFORM_IGNITION_INSTANCE = JniMethod("instance", 
"(Ljava/lang/String;)Lorg/apache/ignite/internal/processors/platform/PlatformProcessor;",
 true);
 +            JniMethod M_PLATFORM_IGNITION_ENVIRONMENT_POINTER = 
JniMethod("environmentPointer", "(Ljava/lang/String;)J", true);
 +            JniMethod M_PLATFORM_IGNITION_STOP = JniMethod("stop", 
"(Ljava/lang/String;Z)Z", true);
 +            JniMethod M_PLATFORM_IGNITION_STOP_ALL = JniMethod("stopAll", 
"(Z)V", true);
 +
 +            const char* C_PLATFORM_ABSTRACT_QRY_CURSOR = 
"org/apache/ignite/internal/processors/platform/cache/query/PlatformAbstractQueryCursor";
 +            JniMethod M_PLATFORM_ABSTRACT_QRY_CURSOR_ITER = 
JniMethod("iterator", "()V", false);
 +            JniMethod M_PLATFORM_ABSTRACT_QRY_CURSOR_ITER_HAS_NEXT = 
JniMethod("iteratorHasNext", "()Z", false);
 +            JniMethod M_PLATFORM_ABSTRACT_QRY_CURSOR_CLOSE = 
JniMethod("close", "()V", false);
 +
 +            const char* C_PLATFORM_CONT_QRY = 
"org/apache/ignite/internal/processors/platform/cache/query/PlatformContinuousQuery";
 +            JniMethod M_PLATFORM_CONT_QRY_CLOSE = JniMethod("close", "()V", 
false);
 +            JniMethod M_PLATFORM_CONT_QRY_GET_INITIAL_QUERY_CURSOR = 
JniMethod("getInitialQueryCursor", 
"()Lorg/apache/ignite/internal/processors/platform/PlatformTarget;", false);
 +
 +            const char* C_PLATFORM_EVENTS = 
"org/apache/ignite/internal/processors/platform/events/PlatformEvents";
 +            JniMethod M_PLATFORM_EVENTS_WITH_ASYNC = JniMethod("withAsync", 
"()Lorg/apache/ignite/internal/processors/platform/events/PlatformEvents;", 
false);
 +            JniMethod M_PLATFORM_EVENTS_STOP_LOCAL_LISTEN = 
JniMethod("stopLocalListen", "(J)Z", false);
 +            JniMethod M_PLATFORM_EVENTS_LOCAL_LISTEN = 
JniMethod("localListen", "(JI)V", false);
 +            JniMethod M_PLATFORM_EVENTS_IS_ENABLED = JniMethod("isEnabled", 
"(I)Z", false);
 +
 +            const char* C_PLATFORM_SERVICES = 
"org/apache/ignite/internal/processors/platform/services/PlatformServices";
 +                      JniMethod M_PLATFORM_SERVICES_WITH_ASYNC = 
JniMethod("withAsync", 
"()Lorg/apache/ignite/internal/processors/platform/services/PlatformServices;", 
false);
 +                      JniMethod M_PLATFORM_SERVICES_WITH_SERVER_KEEP_PORTABLE 
= JniMethod("withServerKeepBinary", 
"()Lorg/apache/ignite/internal/processors/platform/services/PlatformServices;", 
false);
 +                      JniMethod M_PLATFORM_SERVICES_CANCEL = 
JniMethod("cancel", "(Ljava/lang/String;)V", false);
 +                      JniMethod M_PLATFORM_SERVICES_CANCEL_ALL = 
JniMethod("cancelAll", "()V", false);
 +                      JniMethod M_PLATFORM_SERVICES_SERVICE_PROXY = 
JniMethod("serviceProxy", "(Ljava/lang/String;Z)Ljava/lang/Object;", false);
 +
 +            const char* C_PLATFORM_ATOMIC_LONG = 
"org/apache/ignite/internal/processors/platform/datastructures/PlatformAtomicLong";
 +            JniMethod M_PLATFORM_ATOMIC_LONG_GET = JniMethod("get", "()J", 
false);
 +            JniMethod M_PLATFORM_ATOMIC_LONG_INCREMENT_AND_GET = 
JniMethod("incrementAndGet", "()J", false);
 +            JniMethod M_PLATFORM_ATOMIC_LONG_GET_AND_INCREMENT = 
JniMethod("getAndIncrement", "()J", false);
 +            JniMethod M_PLATFORM_ATOMIC_LONG_ADD_AND_GET = 
JniMethod("addAndGet", "(J)J", false);
 +            JniMethod M_PLATFORM_ATOMIC_LONG_GET_AND_ADD = 
JniMethod("getAndAdd", "(J)J", false);
 +            JniMethod M_PLATFORM_ATOMIC_LONG_DECREMENT_AND_GET = 
JniMethod("decrementAndGet", "()J", false);
 +            JniMethod M_PLATFORM_ATOMIC_LONG_GET_AND_DECREMENT = 
JniMethod("getAndDecrement", "()J", false);
 +            JniMethod M_PLATFORM_ATOMIC_LONG_GET_AND_SET = 
JniMethod("getAndSet", "(J)J", false);
 +            JniMethod M_PLATFORM_ATOMIC_LONG_COMPARE_AND_SET_AND_GET = 
JniMethod("compareAndSetAndGet", "(JJ)J", false);
 +            JniMethod M_PLATFORM_ATOMIC_LONG_IS_CLOSED = 
JniMethod("isClosed", "()Z", false);
 +            JniMethod M_PLATFORM_ATOMIC_LONG_CLOSE = JniMethod("close", 
"()V", false);
 +
 +            const char* C_PLATFORM_ATOMIC_SEQUENCE = 
"org/apache/ignite/internal/processors/platform/datastructures/PlatformAtomicSequence";
 +            JniMethod M_PLATFORM_ATOMIC_SEQUENCE_GET = JniMethod("get", 
"()J", false);
 +            JniMethod M_PLATFORM_ATOMIC_SEQUENCE_INCREMENT_AND_GET = 
JniMethod("incrementAndGet", "()J", false);
 +            JniMethod M_PLATFORM_ATOMIC_SEQUENCE_GET_AND_INCREMENT = 
JniMethod("getAndIncrement", "()J", false);
 +            JniMethod M_PLATFORM_ATOMIC_SEQUENCE_ADD_AND_GET = 
JniMethod("addAndGet", "(J)J", false);
 +            JniMethod M_PLATFORM_ATOMIC_SEQUENCE_GET_AND_ADD = 
JniMethod("getAndAdd", "(J)J", false);
 +            JniMethod M_PLATFORM_ATOMIC_SEQUENCE_GET_BATCH_SIZE = 
JniMethod("getBatchSize", "()I", false);
 +            JniMethod M_PLATFORM_ATOMIC_SEQUENCE_SET_BATCH_SIZE = 
JniMethod("setBatchSize", "(I)V", false);
 +            JniMethod M_PLATFORM_ATOMIC_SEQUENCE_IS_CLOSED = 
JniMethod("isClosed", "()Z", false);
 +            JniMethod M_PLATFORM_ATOMIC_SEQUENCE_CLOSE = JniMethod("close", 
"()V", false);
 +
 +            const char* C_PLATFORM_ATOMIC_REFERENCE = 
"org/apache/ignite/internal/processors/platform/datastructures/PlatformAtomicReference";
 +            JniMethod M_PLATFORM_ATOMIC_REFERENCE_IS_CLOSED = 
JniMethod("isClosed", "()Z", false);
 +            JniMethod M_PLATFORM_ATOMIC_REFERENCE_CLOSE = JniMethod("close", 
"()V", false);
 +
 +            const char* C_PLATFORM_LISTENABLE = 
"org/apache/ignite/internal/processors/platform/utils/PlatformListenable";
 +            JniMethod M_PLATFORM_LISTENABLE_CANCEL = JniMethod("cancel", 
"()Z", false);
 +            JniMethod M_PLATFORM_LISTENABLE_IS_CANCELED = 
JniMethod("isCancelled", "()Z", false);
 +
 +            /* STATIC STATE. */
 +            gcc::CriticalSection JVM_LOCK;
 +            JniJvm JVM;
 +            bool PRINT_EXCEPTION = false;
 +
 +            /* HELPER METHODS. */
 +
 +            /**
 +             * Throw exception to Java in case of missing callback pointer. 
It means that callback is not implemented in
 +             * native platform and Java -> platform operation cannot proceede 
further. As JniContext is not available at
 +             * this point, we have to obtain exception details from scratch. 
This is not critical from performance
 +             * perspective because missing handler usually denotes fatal 
condition.
 +             *
 +             * @param env JNI environment.
 +             */
 +            int ThrowOnMissingHandler(JNIEnv* env)
 +            {
 +                jclass cls = env->FindClass(C_PLATFORM_NO_CALLBACK_EXCEPTION);
 +
 +                env->ThrowNew(cls, "Callback handler is not set in native 
platform.");
 +
 +                return 0;
 +            }
 +
 +            char* StringToChars(JNIEnv* env, jstring str, int* len) {
 +                if (!str) {
 +                    *len = 0;
 +                    return NULL;
 +                }
 +
 +                const char* strChars = env->GetStringUTFChars(str, 0);
 +                const int strCharsLen = env->GetStringUTFLength(str);
 +
 +                char* strChars0 = new char[strCharsLen + 1];
 +                std::strcpy(strChars0, strChars);
 +                *(strChars0 + strCharsLen) = 0;
 +
 +                env->ReleaseStringUTFChars(str, strChars);
 +
 +                if (len)
 +                    *len = strCharsLen;
 +
 +                return strChars0;
 +            }
 +
 +            std::string JavaStringToCString(JNIEnv* env, jstring str, int* 
len)
 +            {
 +                char* resChars = StringToChars(env, str, len);
 +
 +                if (resChars)
 +                {
 +                    std::string res = std::string(resChars, *len);
 +
 +                    delete[] resChars;
 +
 +                    return res;
 +                }
 +                else
 +                    return std::string();
 +            }
 +
 +            jclass FindClass(JNIEnv* env, const char *name) {
 +                jclass res = env->FindClass(name);
 +
 +                if (!res)
 +                    throw JvmException();
 +
 +                jclass res0 = static_cast<jclass>(env->NewGlobalRef(res));
 +
 +                env->DeleteLocalRef(res);
 +
 +                return res0;
 +            }
 +
 +            void DeleteClass(JNIEnv* env, jclass cls) {
 +                if (cls)
 +                    env->DeleteGlobalRef(cls);
 +            }
 +
 +            void CheckClass(JNIEnv* env, const char *name)
 +            {
 +                jclass res = env->FindClass(name);
 +
 +                if (!res)
 +                    throw JvmException();
 +            }
 +
 +            jmethodID FindMethod(JNIEnv* env, jclass cls, JniMethod mthd) {
 +                jmethodID mthd0 = mthd.isStatic ?
 +                    env->GetStaticMethodID(cls, mthd.name, mthd.sign) : 
env->GetMethodID(cls, mthd.name, mthd.sign);
 +
 +                if (!mthd0)
 +                    throw JvmException();
 +
 +                return mthd0;
 +            }
 +
 +            void AddNativeMethod(JNINativeMethod* mthd, JniMethod jniMthd, 
void* fnPtr) {
 +                mthd->name = jniMthd.name;
 +                mthd->signature = jniMthd.sign;
 +                mthd->fnPtr = fnPtr;
 +            }
 +
 +            void JniJavaMembers::Initialize(JNIEnv* env) {
 +                c_Class = FindClass(env, C_CLASS);
 +                m_Class_getName = FindMethod(env, c_Class, M_CLASS_GET_NAME);
 +
 +                c_Throwable = FindClass(env, C_THROWABLE);
 +                m_Throwable_getMessage = FindMethod(env, c_Throwable, 
M_THROWABLE_GET_MESSAGE);
 +                m_Throwable_printStackTrace = FindMethod(env, c_Throwable, 
M_THROWABLE_PRINT_STACK_TRACE);
 +            }
 +
 +            void JniJavaMembers::Destroy(JNIEnv* env) {
 +                DeleteClass(env, c_Class);
 +                DeleteClass(env, c_Throwable);
 +            }
 +
 +            bool JniJavaMembers::WriteErrorInfo(JNIEnv* env, char** 
errClsName, int* errClsNameLen, char** errMsg, int* errMsgLen) {
 +                if (env && env->ExceptionCheck()) {
 +                    if (m_Class_getName && m_Throwable_getMessage) {
 +                        jthrowable err = env->ExceptionOccurred();
 +
 +                        env->ExceptionClear();
 +
 +                        jclass errCls = env->GetObjectClass(err);
 +
 +                        jstring clsName = 
static_cast<jstring>(env->CallObjectMethod(errCls, m_Class_getName));
 +                        *errClsName = StringToChars(env, clsName, 
errClsNameLen);
 +
 +                        jstring msg = 
static_cast<jstring>(env->CallObjectMethod(err, m_Throwable_getMessage));
 +                        *errMsg = StringToChars(env, msg, errMsgLen);
 +
 +                        if (errCls)
 +                            env->DeleteLocalRef(errCls);
 +
 +                        if (clsName)
 +                            env->DeleteLocalRef(clsName);
 +
 +                        if (msg)
 +                            env->DeleteLocalRef(msg);
 +
 +                        return true;
 +                    }
 +                    else {
 +                        env->ExceptionClear();
 +                    }
 +                }
 +
 +                return false;
 +            }
 +
 +            void JniMembers::Initialize(JNIEnv* env) {
 +                c_PlatformAbstractQryCursor = FindClass(env, 
C_PLATFORM_ABSTRACT_QRY_CURSOR);
 +                m_PlatformAbstractQryCursor_iter = FindMethod(env, 
c_PlatformAbstractQryCursor, M_PLATFORM_ABSTRACT_QRY_CURSOR_ITER);
 +                m_PlatformAbstractQryCursor_iterHasNext = FindMethod(env, 
c_PlatformAbstractQryCursor, M_PLATFORM_ABSTRACT_QRY_CURSOR_ITER_HAS_NEXT);
 +                m_PlatformAbstractQryCursor_close = FindMethod(env, 
c_PlatformAbstractQryCursor, M_PLATFORM_ABSTRACT_QRY_CURSOR_CLOSE);
 +
 +                c_PlatformAffinity = FindClass(env, C_PLATFORM_AFFINITY);
 +                m_PlatformAffinity_partitions = FindMethod(env, 
c_PlatformAffinity, C_PLATFORM_AFFINITY_PARTITIONS);
 +
 +                c_PlatformCache = FindClass(env, C_PLATFORM_CACHE);
 +                m_PlatformCache_withSkipStore = FindMethod(env, 
c_PlatformCache, M_PLATFORM_CACHE_WITH_SKIP_STORE);
 +                m_PlatformCache_withNoRetries = FindMethod(env, 
c_PlatformCache, M_PLATFORM_CACHE_WITH_NO_RETRIES);
 +                m_PlatformCache_withExpiryPolicy = FindMethod(env, 
c_PlatformCache, M_PLATFORM_CACHE_WITH_EXPIRY_PLC);
 +                m_PlatformCache_withAsync = FindMethod(env, c_PlatformCache, 
M_PLATFORM_CACHE_WITH_ASYNC);
 +                m_PlatformCache_withKeepPortable = FindMethod(env, 
c_PlatformCache, M_PLATFORM_CACHE_WITH_KEEP_PORTABLE);
 +                m_PlatformCache_clear = FindMethod(env, c_PlatformCache, 
M_PLATFORM_CACHE_CLEAR);
 +                m_PlatformCache_removeAll = FindMethod(env, c_PlatformCache, 
M_PLATFORM_CACHE_REMOVE_ALL);
 +                m_PlatformCache_iterator = FindMethod(env, c_PlatformCache, 
M_PLATFORM_CACHE_ITERATOR);
 +                m_PlatformCache_localIterator = FindMethod(env, 
c_PlatformCache, M_PLATFORM_CACHE_LOCAL_ITERATOR);
 +                m_PlatformCache_enterLock = FindMethod(env, c_PlatformCache, 
M_PLATFORM_CACHE_ENTER_LOCK);
 +                m_PlatformCache_exitLock = FindMethod(env, c_PlatformCache, 
M_PLATFORM_CACHE_EXIT_LOCK);
 +                m_PlatformCache_tryEnterLock = FindMethod(env, 
c_PlatformCache, M_PLATFORM_CACHE_TRY_ENTER_LOCK);
 +                m_PlatformCache_closeLock = FindMethod(env, c_PlatformCache, 
M_PLATFORM_CACHE_CLOSE_LOCK);
 +                m_PlatformCache_rebalance = FindMethod(env, c_PlatformCache, 
M_PLATFORM_CACHE_REBALANCE);
 +                m_PlatformCache_size = FindMethod(env, c_PlatformCache, 
M_PLATFORM_CACHE_SIZE);
 +
 +                c_PlatformCacheStoreCallback = FindClass(env, 
C_PLATFORM_CACHE_STORE_CALLBACK);
 +                m_PlatformCacheStoreCallback_invoke = FindMethod(env, 
c_PlatformCacheStoreCallback, M_PLATFORM_CACHE_STORE_CALLBACK_INVOKE);
 +
 +                c_IgniteException = FindClass(env, C_IGNITE_EXCEPTION);
 +
 +                c_PlatformClusterGroup = FindClass(env, 
C_PLATFORM_CLUSTER_GRP);
 +                m_PlatformClusterGroup_forOthers = FindMethod(env, 
c_PlatformClusterGroup, M_PLATFORM_CLUSTER_GRP_FOR_OTHERS);
 +                m_PlatformClusterGroup_forRemotes = FindMethod(env, 
c_PlatformClusterGroup, M_PLATFORM_CLUSTER_GRP_FOR_REMOTES);
 +                m_PlatformClusterGroup_forDaemons = FindMethod(env, 
c_PlatformClusterGroup, M_PLATFORM_CLUSTER_GRP_FOR_DAEMONS);
 +                m_PlatformClusterGroup_forRandom = FindMethod(env, 
c_PlatformClusterGroup, M_PLATFORM_CLUSTER_GRP_FOR_RANDOM);
 +                m_PlatformClusterGroup_forOldest = FindMethod(env, 
c_PlatformClusterGroup, M_PLATFORM_CLUSTER_GRP_FOR_OLDEST);
 +                m_PlatformClusterGroup_forYoungest = FindMethod(env, 
c_PlatformClusterGroup, M_PLATFORM_CLUSTER_GRP_FOR_YOUNGEST);
 +                m_PlatformClusterGroup_resetMetrics = FindMethod(env, 
c_PlatformClusterGroup, M_PLATFORM_CLUSTER_GRP_RESET_METRICS);
 +
 +                c_PlatformCompute = FindClass(env, C_PLATFORM_COMPUTE);
 +                m_PlatformCompute_withNoFailover = FindMethod(env, 
c_PlatformCompute, M_PLATFORM_COMPUTE_WITH_NO_FAILOVER);
 +                m_PlatformCompute_withTimeout = FindMethod(env, 
c_PlatformCompute, M_PLATFORM_COMPUTE_WITH_TIMEOUT);
 +                m_PlatformCompute_executeNative = FindMethod(env, 
c_PlatformCompute, M_PLATFORM_COMPUTE_EXECUTE_NATIVE);
 +
 +                c_PlatformContinuousQuery = FindClass(env, 
C_PLATFORM_CONT_QRY);
 +                m_PlatformContinuousQuery_close = FindMethod(env, 
c_PlatformContinuousQuery, M_PLATFORM_CONT_QRY_CLOSE);
 +                m_PlatformContinuousQuery_getInitialQueryCursor = 
FindMethod(env, c_PlatformContinuousQuery, 
M_PLATFORM_CONT_QRY_GET_INITIAL_QUERY_CURSOR);
 +
 +                c_PlatformDataStreamer = FindClass(env, 
C_PLATFORM_DATA_STREAMER);
 +                m_PlatformDataStreamer_listenTopology = FindMethod(env, 
c_PlatformDataStreamer, M_PLATFORM_DATA_STREAMER_LISTEN_TOPOLOGY);
 +                m_PlatformDataStreamer_getAllowOverwrite = FindMethod(env, 
c_PlatformDataStreamer, M_PLATFORM_DATA_STREAMER_GET_ALLOW_OVERWRITE);
 +                m_PlatformDataStreamer_setAllowOverwrite = FindMethod(env, 
c_PlatformDataStreamer, M_PLATFORM_DATA_STREAMER_SET_ALLOW_OVERWRITE);
 +                m_PlatformDataStreamer_getSkipStore = FindMethod(env, 
c_PlatformDataStreamer, M_PLATFORM_DATA_STREAMER_GET_SKIP_STORE);
 +                m_PlatformDataStreamer_setSkipStore = FindMethod(env, 
c_PlatformDataStreamer, M_PLATFORM_DATA_STREAMER_SET_SKIP_STORE);
 +                m_PlatformDataStreamer_getPerNodeBufSize = FindMethod(env, 
c_PlatformDataStreamer, M_PLATFORM_DATA_STREAMER_GET_PER_NODE_BUFFER_SIZE);
 +                m_PlatformDataStreamer_setPerNodeBufSize = FindMethod(env, 
c_PlatformDataStreamer, M_PLATFORM_DATA_STREAMER_SET_PER_NODE_BUFFER_SIZE);
 +                m_PlatformDataStreamer_getPerNodeParallelOps = 
FindMethod(env, c_PlatformDataStreamer, 
M_PLATFORM_DATA_STREAMER_GET_PER_NODE_PARALLEL_OPS);
 +                m_PlatformDataStreamer_setPerNodeParallelOps = 
FindMethod(env, c_PlatformDataStreamer, 
M_PLATFORM_DATA_STREAMER_SET_PER_NODE_PARALLEL_OPS);
 +
 +                c_PlatformEvents = FindClass(env, C_PLATFORM_EVENTS);
 +                m_PlatformEvents_withAsync = FindMethod(env, 
c_PlatformEvents, M_PLATFORM_EVENTS_WITH_ASYNC);
 +                m_PlatformEvents_stopLocalListen = FindMethod(env, 
c_PlatformEvents, M_PLATFORM_EVENTS_STOP_LOCAL_LISTEN);
 +                m_PlatformEvents_localListen = FindMethod(env, 
c_PlatformEvents, M_PLATFORM_EVENTS_LOCAL_LISTEN);
 +                m_PlatformEvents_isEnabled = FindMethod(env, 
c_PlatformEvents, M_PLATFORM_EVENTS_IS_ENABLED);
 +
 +                              c_PlatformServices = FindClass(env, 
C_PLATFORM_SERVICES);
 +                              m_PlatformServices_withAsync = FindMethod(env, 
c_PlatformServices, M_PLATFORM_SERVICES_WITH_ASYNC);
 +                              m_PlatformServices_withServerKeepPortable = 
FindMethod(env, c_PlatformServices, 
M_PLATFORM_SERVICES_WITH_SERVER_KEEP_PORTABLE);
 +                              m_PlatformServices_cancel = FindMethod(env, 
c_PlatformServices, M_PLATFORM_SERVICES_CANCEL);
 +                              m_PlatformServices_cancelAll = FindMethod(env, 
c_PlatformServices, M_PLATFORM_SERVICES_CANCEL_ALL);
 +                              m_PlatformServices_serviceProxy = 
FindMethod(env, c_PlatformServices, M_PLATFORM_SERVICES_SERVICE_PROXY);
 +
 +                c_PlatformIgnition = FindClass(env, C_PLATFORM_IGNITION);
 +                m_PlatformIgnition_start = FindMethod(env, 
c_PlatformIgnition, M_PLATFORM_IGNITION_START);
 +                m_PlatformIgnition_instance = FindMethod(env, 
c_PlatformIgnition, M_PLATFORM_IGNITION_INSTANCE);
 +                m_PlatformIgnition_environmentPointer = FindMethod(env, 
c_PlatformIgnition, M_PLATFORM_IGNITION_ENVIRONMENT_POINTER);
 +                m_PlatformIgnition_stop = FindMethod(env, c_PlatformIgnition, 
M_PLATFORM_IGNITION_STOP);
 +                m_PlatformIgnition_stopAll = FindMethod(env, 
c_PlatformIgnition, M_PLATFORM_IGNITION_STOP_ALL);
 +
 +                c_PlatformMessaging = FindClass(env, C_PLATFORM_MESSAGING);
 +                m_PlatformMessaging_withAsync = FindMethod(env, 
c_PlatformMessaging, M_PLATFORM_MESSAGING_WITH_ASYNC);
 +
 +                c_PlatformProcessor = FindClass(env, C_PLATFORM_PROCESSOR);
 +                m_PlatformProcessor_releaseStart = FindMethod(env, 
c_PlatformProcessor, M_PLATFORM_PROCESSOR_RELEASE_START);
 +                m_PlatformProcessor_cache = FindMethod(env, 
c_PlatformProcessor, M_PLATFORM_PROCESSOR_CACHE);
 +                m_PlatformProcessor_createCache = FindMethod(env, 
c_PlatformProcessor, M_PLATFORM_PROCESSOR_CREATE_CACHE);
 +                m_PlatformProcessor_getOrCreateCache = FindMethod(env, 
c_PlatformProcessor, M_PLATFORM_PROCESSOR_GET_OR_CREATE_CACHE);
 +                m_PlatformProcessor_createCacheFromConfig = FindMethod(env, 
c_PlatformProcessor, M_PLATFORM_PROCESSOR_CREATE_CACHE_FROM_CONFIG);
 +                m_PlatformProcessor_getOrCreateCacheFromConfig = 
FindMethod(env, c_PlatformProcessor, 
M_PLATFORM_PROCESSOR_GET_OR_CREATE_CACHE_FROM_CONFIG);
++                m_PlatformProcessor_createNearCache = FindMethod(env, 
c_PlatformProcessor, M_PLATFORM_PROCESSOR_CREATE_NEAR_CACHE);
++                m_PlatformProcessor_getOrCreateNearCache = FindMethod(env, 
c_PlatformProcessor, M_PLATFORM_PROCESSOR_GET_OR_CREATE_NEAR_CACHE);
 +                m_PlatformProcessor_destroyCache = FindMethod(env, 
c_PlatformProcessor, M_PLATFORM_PROCESSOR_DESTROY_CACHE);
 +                m_PlatformProcessor_affinity = FindMethod(env, 
c_PlatformProcessor, M_PLATFORM_PROCESSOR_AFFINITY);
 +                m_PlatformProcessor_dataStreamer = FindMethod(env, 
c_PlatformProcessor, M_PLATFORM_PROCESSOR_DATA_STREAMER);
 +                m_PlatformProcessor_transactions = FindMethod(env, 
c_PlatformProcessor, M_PLATFORM_PROCESSOR_TRANSACTIONS);
 +                m_PlatformProcessor_projection = FindMethod(env, 
c_PlatformProcessor, M_PLATFORM_PROCESSOR_PROJECTION);
 +                m_PlatformProcessor_compute = FindMethod(env, 
c_PlatformProcessor, M_PLATFORM_PROCESSOR_COMPUTE);
 +                m_PlatformProcessor_message = FindMethod(env, 
c_PlatformProcessor, M_PLATFORM_PROCESSOR_MESSAGE);
 +                m_PlatformProcessor_events = FindMethod(env, 
c_PlatformProcessor, M_PLATFORM_PROCESSOR_EVENTS);
 +                m_PlatformProcessor_services = FindMethod(env, 
c_PlatformProcessor, M_PLATFORM_PROCESSOR_SERVICES);
 +                m_PlatformProcessor_extensions = FindMethod(env, 
c_PlatformProcessor, M_PLATFORM_PROCESSOR_EXTENSIONS);
 +                m_PlatformProcessor_atomicLong = FindMethod(env, 
c_PlatformProcessor, M_PLATFORM_PROCESSOR_ATOMIC_LONG);
 +                m_PlatformProcessor_atomicSequence = FindMethod(env, 
c_PlatformProcessor, M_PLATFORM_PROCESSOR_ATOMIC_SEQUENCE);
 +                m_PlatformProcessor_atomicReference = FindMethod(env, 
c_PlatformProcessor, M_PLATFORM_PROCESSOR_ATOMIC_REFERENCE);
 +                              m_PlatformProcessor_getIgniteConfiguration = 
FindMethod(env, c_PlatformProcessor, 
M_PLATFORM_PROCESSOR_GET_IGNITE_CONFIGURATION);
 +
 +                c_PlatformTarget = FindClass(env, C_PLATFORM_TARGET);
 +                m_PlatformTarget_inStreamOutLong = FindMethod(env, 
c_PlatformTarget, M_PLATFORM_TARGET_IN_STREAM_OUT_LONG);
 +                m_PlatformTarget_inStreamOutObject = FindMethod(env, 
c_PlatformTarget, M_PLATFORM_TARGET_IN_STREAM_OUT_OBJECT);
 +                m_PlatformTarget_outLong = FindMethod(env, c_PlatformTarget, 
M_PLATFORM_TARGET_OUT_LONG);
 +                m_PlatformTarget_outStream = FindMethod(env, 
c_PlatformTarget, M_PLATFORM_TARGET_OUT_STREAM);
 +                m_PlatformTarget_outObject = FindMethod(env, 
c_PlatformTarget, M_PLATFORM_TARGET_OUT_OBJECT);
 +                m_PlatformTarget_inStreamOutStream = FindMethod(env, 
c_PlatformTarget, M_PLATFORM_TARGET_IN_STREAM_OUT_STREAM);
 +                m_PlatformTarget_inObjectStreamOutStream = FindMethod(env, 
c_PlatformTarget, M_PLATFORM_TARGET_IN_OBJECT_STREAM_OUT_STREAM);
 +                m_PlatformTarget_listenFuture = FindMethod(env, 
c_PlatformTarget, M_PLATFORM_TARGET_LISTEN_FUTURE);
 +                m_PlatformTarget_listenFutureForOperation = FindMethod(env, 
c_PlatformTarget, M_PLATFORM_TARGET_LISTEN_FOR_OPERATION);
 +                m_PlatformTarget_listenFutureAndGet = FindMethod(env, 
c_PlatformTarget, M_PLATFORM_TARGET_LISTEN_FUTURE_AND_GET);
 +                m_PlatformTarget_listenFutureForOperationAndGet = 
FindMethod(env, c_PlatformTarget, 
M_PLATFORM_TARGET_LISTEN_FOR_OPERATION_AND_GET);
 +
 +                c_PlatformTransactions = FindClass(env, 
C_PLATFORM_TRANSACTIONS);
 +                m_PlatformTransactions_txStart = FindMethod(env, 
c_PlatformTransactions, M_PLATFORM_TRANSACTIONS_TX_START);
 +                m_PlatformTransactions_txCommit = FindMethod(env, 
c_PlatformTransactions, M_PLATFORM_TRANSACTIONS_TX_COMMIT);
 +                m_PlatformTransactions_txRollback = FindMethod(env, 
c_PlatformTransactions, M_PLATFORM_TRANSACTIONS_TX_ROLLBACK);
 +                m_PlatformTransactions_txCommitAsync = FindMethod(env, 
c_PlatformTransactions, M_PLATFORM_TRANSACTIONS_TX_COMMIT_ASYNC);
 +                m_PlatformTransactions_txRollbackAsync = FindMethod(env, 
c_PlatformTransactions, M_PLATFORM_TRANSACTIONS_TX_ROLLBACK_ASYNC);
 +                m_PlatformTransactions_txState = FindMethod(env, 
c_PlatformTransactions, M_PLATFORM_TRANSACTIONS_TX_STATE);
 +                m_PlatformTransactions_txSetRollbackOnly = FindMethod(env, 
c_PlatformTransactions, M_PLATFORM_TRANSACTIONS_TX_SET_ROLLBACK_ONLY);
 +                m_PlatformTransactions_txClose = FindMethod(env, 
c_PlatformTransactions, M_PLATFORM_TRANSACTIONS_TX_CLOSE);
 +                m_PlatformTransactions_resetMetrics = FindMethod(env, 
c_PlatformTransactions, M_PLATFORM_TRANSACTIONS_RESET_METRICS);
 +
 +                c_PlatformUtils = FindClass(env, C_PLATFORM_UTILS);
 +                m_PlatformUtils_reallocate = FindMethod(env, c_PlatformUtils, 
M_PLATFORM_UTILS_REALLOC);
 +                m_PlatformUtils_errData = FindMethod(env, c_PlatformUtils, 
M_PLATFORM_UTILS_ERR_DATA);
 +
 +                c_PlatformAtomicLong = FindClass(env, C_PLATFORM_ATOMIC_LONG);
 +                m_PlatformAtomicLong_get = FindMethod(env, 
c_PlatformAtomicLong, M_PLATFORM_ATOMIC_LONG_GET);
 +                m_PlatformAtomicLong_incrementAndGet = FindMethod(env, 
c_PlatformAtomicLong, M_PLATFORM_ATOMIC_LONG_INCREMENT_AND_GET);
 +                m_PlatformAtomicLong_getAndIncrement = FindMethod(env, 
c_PlatformAtomicLong, M_PLATFORM_ATOMIC_LONG_GET_AND_INCREMENT);
 +                m_PlatformAtomicLong_addAndGet = FindMethod(env, 
c_PlatformAtomicLong, M_PLATFORM_ATOMIC_LONG_ADD_AND_GET);
 +                m_PlatformAtomicLong_getAndAdd = FindMethod(env, 
c_PlatformAtomicLong, M_PLATFORM_ATOMIC_LONG_GET_AND_ADD);
 +                m_PlatformAtomicLong_decrementAndGet = FindMethod(env, 
c_PlatformAtomicLong, M_PLATFORM_ATOMIC_LONG_DECREMENT_AND_GET);
 +                m_PlatformAtomicLong_getAndDecrement = FindMethod(env, 
c_PlatformAtomicLong, M_PLATFORM_ATOMIC_LONG_GET_AND_DECREMENT);
 +                m_PlatformAtomicLong_getAndSet = FindMethod(env, 
c_PlatformAtomicLong, M_PLATFORM_ATOMIC_LONG_GET_AND_SET);
 +                m_PlatformAtomicLong_compareAndSetAndGet = FindMethod(env, 
c_PlatformAtomicLong, M_PLATFORM_ATOMIC_LONG_COMPARE_AND_SET_AND_GET);
 +                m_PlatformAtomicLong_isClosed = FindMethod(env, 
c_PlatformAtomicLong, M_PLATFORM_ATOMIC_LONG_IS_CLOSED);
 +                m_PlatformAtomicLong_close = FindMethod(env, 
c_PlatformAtomicLong, M_PLATFORM_ATOMIC_LONG_CLOSE);
 +
 +                jclass c_PlatformAtomicSequence = FindClass(env, 
C_PLATFORM_ATOMIC_SEQUENCE);
 +                m_PlatformAtomicSequence_get = FindMethod(env, 
c_PlatformAtomicSequence, M_PLATFORM_ATOMIC_SEQUENCE_GET);
 +                m_PlatformAtomicSequence_incrementAndGet = FindMethod(env, 
c_PlatformAtomicSequence, M_PLATFORM_ATOMIC_SEQUENCE_INCREMENT_AND_GET);
 +                m_PlatformAtomicSequence_getAndIncrement = FindMethod(env, 
c_PlatformAtomicSequence, M_PLATFORM_ATOMIC_SEQUENCE_GET_AND_INCREMENT);
 +                m_PlatformAtomicSequence_addAndGet = FindMethod(env, 
c_PlatformAtomicSequence, M_PLATFORM_ATOMIC_SEQUENCE_ADD_AND_GET);
 +                m_PlatformAtomicSequence_getAndAdd = FindMethod(env, 
c_PlatformAtomicSequence, M_PLATFORM_ATOMIC_SEQUENCE_GET_AND_ADD);
 +                m_PlatformAtomicSequence_getBatchSize = FindMethod(env, 
c_PlatformAtomicSequence, M_PLATFORM_ATOMIC_SEQUENCE_GET_BATCH_SIZE);
 +                m_PlatformAtomicSequence_setBatchSize = FindMethod(env, 
c_PlatformAtomicSequence, M_PLATFORM_ATOMIC_SEQUENCE_SET_BATCH_SIZE);
 +                m_PlatformAtomicSequence_isClosed = FindMethod(env, 
c_PlatformAtomicSequence, M_PLATFORM_ATOMIC_SEQUENCE_IS_CLOSED);
 +                m_PlatformAtomicSequence_close = FindMethod(env, 
c_PlatformAtomicSequence, M_PLATFORM_ATOMIC_SEQUENCE_CLOSE);
 +
 +                jclass c_PlatformAtomicReference = FindClass(env, 
C_PLATFORM_ATOMIC_REFERENCE);
 +                m_PlatformAtomicReference_isClosed = FindMethod(env, 
c_PlatformAtomicReference, M_PLATFORM_ATOMIC_REFERENCE_IS_CLOSED);
 +                m_PlatformAtomicReference_close = FindMethod(env, 
c_PlatformAtomicReference, M_PLATFORM_ATOMIC_REFERENCE_CLOSE);
 +
 +                c_PlatformListenable = FindClass(env, C_PLATFORM_LISTENABLE);
 +                m_PlatformListenable_cancel = FindMethod(env, 
c_PlatformListenable, M_PLATFORM_LISTENABLE_CANCEL);                    
 +                m_PlatformListenable_isCancelled = FindMethod(env, 
c_PlatformListenable, M_PLATFORM_LISTENABLE_IS_CANCELED);
 +
 +                // Find utility classes which are not used from context, but 
are still required in other places.
 +                CheckClass(env, C_PLATFORM_NO_CALLBACK_EXCEPTION);
 +            }
 +
 +            void JniMembers::Destroy(JNIEnv* env) {
 +                DeleteClass(env, c_PlatformAbstractQryCursor);
 +                DeleteClass(env, c_PlatformAffinity);
 +                DeleteClass(env, c_PlatformCache);
 +                DeleteClass(env, c_PlatformCacheStoreCallback);
 +                DeleteClass(env, c_IgniteException);
 +                DeleteClass(env, c_PlatformClusterGroup);
 +                DeleteClass(env, c_PlatformCompute);
 +                DeleteClass(env, c_PlatformContinuousQuery);
 +                DeleteClass(env, c_PlatformDataStreamer);
 +                DeleteClass(env, c_PlatformEvents);
 +                DeleteClass(env, c_PlatformIgnition);
 +                DeleteClass(env, c_PlatformMessaging);
 +                DeleteClass(env, c_PlatformProcessor);
 +                DeleteClass(env, c_PlatformTarget);
 +                DeleteClass(env, c_PlatformTransactions);
 +                DeleteClass(env, c_PlatformUtils);
 +            }
 +
 +            JniJvm::JniJvm() : jvm(NULL), javaMembers(JniJavaMembers()), 
members(JniMembers())
 +            {
 +                // No-op.
 +            }
 +
 +            JniJvm::JniJvm(JavaVM* jvm, JniJavaMembers javaMembers, 
JniMembers members) :
 +                jvm(jvm), javaMembers(javaMembers), members(members)
 +            {
 +                // No-op.
 +            }
 +
 +            JavaVM* JniJvm::GetJvm()
 +            {
 +                return jvm;
 +            }
 +
 +            JniJavaMembers& JniJvm::GetJavaMembers()
 +            {
 +                return javaMembers;
 +            }
 +
 +            JniMembers& JniJvm::GetMembers()
 +            {
 +                return members;
 +            }
 +
 +            /**
 +             * Create JVM.
 +             */
 +            jint CreateJvm(char** opts, int optsLen, JavaVM** jvm, JNIEnv** 
env) {
 +                JavaVMOption* opts0 = new JavaVMOption[optsLen];
 +
 +                for (int i = 0; i < optsLen; i++)
 +                    opts0[i].optionString = *(opts + i);
 +
 +                JavaVMInitArgs args;
 +
 +                args.version = JNI_VERSION_1_6;
 +                args.nOptions = optsLen;
 +                args.options = opts0;
 +                args.ignoreUnrecognized = 0;
 +
 +                jint res = JNI_CreateJavaVM(jvm, 
reinterpret_cast<void**>(env), &args);
 +
 +                delete[] opts0;
 +
 +                return res;
 +            }
 +
 +            void RegisterNatives(JNIEnv* env) {
 +                {
 +                                      JNINativeMethod methods[54];
 +
 +                    int idx = 0;
 +
 +                    AddNativeMethod(methods + idx++, 
M_PLATFORM_CALLBACK_UTILS_CACHE_STORE_CREATE, 
reinterpret_cast<void*>(JniCacheStoreCreate));
 +                    AddNativeMethod(methods + idx++, 
M_PLATFORM_CALLBACK_UTILS_CACHE_STORE_INVOKE, 
reinterpret_cast<void*>(JniCacheStoreInvoke));
 +                    AddNativeMethod(methods + idx++, 
M_PLATFORM_CALLBACK_UTILS_CACHE_STORE_DESTROY, 
reinterpret_cast<void*>(JniCacheStoreDestroy));
 +
 +                    AddNativeMethod(methods + idx++, 
M_PLATFORM_CALLBACK_UTILS_CACHE_STORE_SESSION_CREATE, 
reinterpret_cast<void*>(JniCacheStoreSessionCreate));
 +
 +                    AddNativeMethod(methods + idx++, 
M_PLATFORM_CALLBACK_UTILS_CACHE_ENTRY_FILTER_CREATE, 
reinterpret_cast<void*>(JniCacheEntryFilterCreate));
 +                    AddNativeMethod(methods + idx++, 
M_PLATFORM_CALLBACK_UTILS_CACHE_ENTRY_FILTER_APPLY, 
reinterpret_cast<void*>(JniCacheEntryFilterApply));
 +                    AddNativeMethod(methods + idx++, 
M_PLATFORM_CALLBACK_UTILS_CACHE_ENTRY_FILTER_DESTROY, 
reinterpret_cast<void*>(JniCacheEntryFilterDestroy));
 +
 +                    AddNativeMethod(methods + idx++, 
M_PLATFORM_CALLBACK_UTILS_CACHE_INVOKE, 
reinterpret_cast<void*>(JniCacheInvoke));
 +
 +                    AddNativeMethod(methods + idx++, 
M_PLATFORM_CALLBACK_UTILS_COMPUTE_TASK_MAP, 
reinterpret_cast<void*>(JniComputeTaskMap));
 +                    AddNativeMethod(methods + idx++, 
M_PLATFORM_CALLBACK_UTILS_COMPUTE_TASK_JOB_RESULT, 
reinterpret_cast<void*>(JniComputeTaskJobResult));
 +                    AddNativeMethod(methods + idx++, 
M_PLATFORM_CALLBACK_UTILS_COMPUTE_TASK_REDUCE, 
reinterpret_cast<void*>(JniComputeTaskReduce));
 +                    AddNativeMethod(methods + idx++, 
M_PLATFORM_CALLBACK_UTILS_COMPUTE_TASK_COMPLETE, 
reinterpret_cast<void*>(JniComputeTaskComplete));
 +
 +                    AddNativeMethod(methods + idx++, 
M_PLATFORM_CALLBACK_UTILS_COMPUTE_JOB_SERIALIZE, 
reinterpret_cast<void*>(JniComputeJobSerialize));
 +                    AddNativeMethod(methods + idx++, 
M_PLATFORM_CALLBACK_UTILS_COMPUTE_JOB_CREATE, 
reinterpret_cast<void*>(JniComputeJobCreate));
 +                    AddNativeMethod(methods + idx++, 
M_PLATFORM_CALLBACK_UTILS_COMPUTE_JOB_EXECUTE, 
reinterpret_cast<void*>(JniComputeJobExecute));
 +                    AddNativeMethod(methods + idx++, 
M_PLATFORM_CALLBACK_UTILS_COMPUTE_JOB_DESTROY, 
reinterpret_cast<void*>(JniComputeJobDestroy));
 +                    AddNativeMethod(methods + idx++, 
M_PLATFORM_CALLBACK_UTILS_COMPUTE_JOB_CANCEL, 
reinterpret_cast<void*>(JniComputeJobCancel));
 +
 +                    AddNativeMethod(methods + idx++, 
M_PLATFORM_CALLBACK_UTILS_CONTINUOUS_QUERY_LSNR_APPLY, 
reinterpret_cast<void*>(JniContinuousQueryListenerApply));
 +                    AddNativeMethod(methods + idx++, 
M_PLATFORM_CALLBACK_UTILS_CONTINUOUS_QUERY_FILTER_CREATE, 
reinterpret_cast<void*>(JniContinuousQueryFilterCreate));
 +                    AddNativeMethod(methods + idx++, 
M_PLATFORM_CALLBACK_UTILS_CONTINUOUS_QUERY_FILTER_EVAL, 
reinterpret_cast<void*>(JniContinuousQueryFilterApply));
 +                    AddNativeMethod(methods + idx++, 
M_PLATFORM_CALLBACK_UTILS_CONTINUOUS_QUERY_FILTER_RELEASE, 
reinterpret_cast<void*>(JniContinuousQueryFilterRelease));
 +
 +                    AddNativeMethod(methods + idx++, 
M_PLATFORM_CALLBACK_UTILS_DATA_STREAMER_TOPOLOGY_UPDATE, 
reinterpret_cast<void*>(JniDataStreamerTopologyUpdate));
 +                    AddNativeMethod(methods + idx++, 
M_PLATFORM_CALLBACK_UTILS_DATA_STREAMER_STREAM_RECEIVER_INVOKE, 
reinterpret_cast<void*>(JniDataStreamerStreamReceiverInvoke));
 +
 +                    AddNativeMethod(methods + idx++, 
M_PLATFORM_CALLBACK_UTILS_FUTURE_BYTE_RES, 
reinterpret_cast<void*>(JniFutureByteResult));
 +                    AddNativeMethod(methods + idx++, 
M_PLATFORM_CALLBACK_UTILS_FUTURE_BOOL_RES, 
reinterpret_cast<void*>(JniFutureBoolResult));
 +                    AddNativeMethod(methods + idx++, 
M_PLATFORM_CALLBACK_UTILS_FUTURE_SHORT_RES, 
reinterpret_cast<void*>(JniFutureShortResult));
 +                    AddNativeMethod(methods + idx++, 
M_PLATFORM_CALLBACK_UTILS_FUTURE_CHAR_RES, 
reinterpret_cast<void*>(JniFutureCharResult));
 +                    AddNativeMethod(methods + idx++, 
M_PLATFORM_CALLBACK_UTILS_FUTURE_INT_RES, 
reinterpret_cast<void*>(JniFutureIntResult));
 +                    AddNativeMethod(methods + idx++, 
M_PLATFORM_CALLBACK_UTILS_FUTURE_FLOAT_RES, 
reinterpret_cast<void*>(JniFutureFloatResult));
 +                    AddNativeMethod(methods + idx++, 
M_PLATFORM_CALLBACK_UTILS_FUTURE_LONG_RES, 
reinterpret_cast<void*>(JniFutureLongResult));
 +                    AddNativeMethod(methods + idx++, 
M_PLATFORM_CALLBACK_UTILS_FUTURE_DOUBLE_RES, 
reinterpret_cast<void*>(JniFutureDoubleResult));
 +                    AddNativeMethod(methods + idx++, 
M_PLATFORM_CALLBACK_UTILS_FUTURE_OBJ_RES, 
reinterpret_cast<void*>(JniFutureObjectResult));
 +                    AddNativeMethod(methods + idx++, 
M_PLATFORM_CALLBACK_UTILS_FUTURE_NULL_RES, 
reinterpret_cast<void*>(JniFutureNullResult));
 +                    AddNativeMethod(methods + idx++, 
M_PLATFORM_CALLBACK_UTILS_FUTURE_ERR, reinterpret_cast<void*>(JniFutureError));
 +
 +                    AddNativeMethod(methods + idx++, 
M_PLATFORM_CALLBACK_UTILS_LIFECYCLE_EVENT, 
reinterpret_cast<void*>(JniLifecycleEvent));
 +
 +                    AddNativeMethod(methods + idx++, 
M_PLATFORM_CALLBACK_UTILS_MESSAGING_FILTER_CREATE, 
reinterpret_cast<void*>(JniMessagingFilterCreate));
 +                    AddNativeMethod(methods + idx++, 
M_PLATFORM_CALLBACK_UTILS_MESSAGING_FILTER_APPLY, 
reinterpret_cast<void*>(JniMessagingFilterApply));
 +                    AddNativeMethod(methods + idx++, 
M_PLATFORM_CALLBACK_UTILS_MESSAGING_FILTER_DESTROY, 
reinterpret_cast<void*>(JniMessagingFilterDestroy));
 +
 +                    AddNativeMethod(methods + idx++, 
M_PLATFORM_CALLBACK_UTILS_EVENT_FILTER_CREATE, 
reinterpret_cast<void*>(JniEventFilterCreate));
 +                    AddNativeMethod(methods + idx++, 
M_PLATFORM_CALLBACK_UTILS_EVENT_FILTER_APPLY, 
reinterpret_cast<void*>(JniEventFilterApply));
 +                    AddNativeMethod(methods + idx++, 
M_PLATFORM_CALLBACK_UTILS_EVENT_FILTER_DESTROY, 
reinterpret_cast<void*>(JniEventFilterDestroy));
 +
 +                    AddNativeMethod(methods + idx++, 
M_PLATFORM_CALLBACK_UTILS_SERVICE_INIT, 
reinterpret_cast<void*>(JniServiceInit));
 +                    AddNativeMethod(methods + idx++, 
M_PLATFORM_CALLBACK_UTILS_SERVICE_EXECUTE, 
reinterpret_cast<void*>(JniServiceExecute));
 +                    AddNativeMethod(methods + idx++, 
M_PLATFORM_CALLBACK_UTILS_SERVICE_CANCEL, 
reinterpret_cast<void*>(JniServiceCancel));
 +                    AddNativeMethod(methods + idx++, 
M_PLATFORM_CALLBACK_UTILS_SERVICE_INVOKE_METHOD, 
reinterpret_cast<void*>(JniServiceInvokeMethod));
 +
 +                    AddNativeMethod(methods + idx++, 
M_PLATFORM_CALLBACK_UTILS_CLUSTER_NODE_FILTER_APPLY, 
reinterpret_cast<void*>(JniClusterNodeFilterApply));
 +
 +                    AddNativeMethod(methods + idx++, 
M_PLATFORM_CALLBACK_UTILS_NODE_INFO, reinterpret_cast<void*>(JniNodeInfo));
 +
 +                    AddNativeMethod(methods + idx++, 
M_PLATFORM_CALLBACK_UTILS_MEMORY_REALLOCATE, 
reinterpret_cast<void*>(JniMemoryReallocate));
 +
 +                    AddNativeMethod(methods + idx++, 
M_PLATFORM_CALLBACK_UTILS_ON_START, reinterpret_cast<void*>(JniOnStart));
 +                    AddNativeMethod(methods + idx++, 
M_PLATFORM_CALLBACK_UTILS_ON_STOP, reinterpret_cast<void*>(JniOnStop));
 +
 +                    AddNativeMethod(methods + idx++, 
M_PLATFORM_CALLBACK_UTILS_EXTENSION_CALLBACK_IN_LONG_OUT_LONG, 
reinterpret_cast<void*>(JniExtensionCallbackInLongOutLong));
 +                    AddNativeMethod(methods + idx++, 
M_PLATFORM_CALLBACK_UTILS_EXTENSION_CALLBACK_IN_LONG_LONG_OUT_LONG, 
reinterpret_cast<void*>(JniExtensionCallbackInLongLongOutLong));
 +
 +                    AddNativeMethod(methods + idx++, 
M_PLATFORM_CALLBACK_UTILS_ON_CLIENT_DISCONNECTED, 
reinterpret_cast<void*>(JniOnClientDisconnected));
 +                    AddNativeMethod(methods + idx++, 
M_PLATFORM_CALLBACK_UTILS_ON_CLIENT_RECONNECTED, 
reinterpret_cast<void*>(JniOnClientReconnected));
 +
 +                    jint res = env->RegisterNatives(FindClass(env, 
C_PLATFORM_CALLBACK_UTILS), methods, idx);
 +
 +                    if (res != JNI_OK)
 +                        throw JvmException();
 +                }
 +            }
 +
 +            JniContext::JniContext(JniJvm* jvm, JniHandlers hnds) : jvm(jvm), 
hnds(hnds) {
 +                // No-op.
 +            }
 +
 +            JniContext* JniContext::Create(char** opts, int optsLen, 
JniHandlers hnds) {
 +                return Create(opts, optsLen, hnds, NULL);
 +            }
 +
 +            void GetJniErrorMessage(std::string& errMsg, jint res)
 +            {
 +                switch (res)
 +                {
 +                    case JNI_ERR:
 +                        errMsg = "Unknown error (JNI_ERR).";
 +                        break;
 +
 +                    case JNI_EDETACHED:
 +                        errMsg = "Thread detached from the JVM.";
 +                        break;
 +
 +                    case JNI_EVERSION:
 +                        errMsg = "JNI version error.";
 +                        break;
 +
 +                    case JNI_ENOMEM:
 +                        errMsg = "Could not reserve enough space for object 
heap. Check Xmx option.";
 +                        break;
 +
 +                    case JNI_EEXIST:
 +                        errMsg = "JVM already created.";
 +                        break;
 +
 +                    case JNI_EINVAL:
 +                        errMsg = "Invalid JVM arguments.";
 +                        break;
 +
 +                    default:
 +                        errMsg = "Unexpected JNI_CreateJavaVM result.";
 +                        break;
 +                }
 +            }
 +
 +            JniContext* JniContext::Create(char** opts, int optsLen, 
JniHandlers hnds, JniErrorInfo* errInfo)
 +            {
 +                // Acquire global lock to instantiate the JVM.
 +                JVM_LOCK.Enter();
 +
 +                // Define local variables.
 +                JavaVM* jvm = NULL;
 +                JNIEnv* env = NULL;
 +
 +                JniJavaMembers javaMembers;
 +                memset(&javaMembers, 0, sizeof(javaMembers));
 +
 +                JniMembers members;
 +                memset(&members, 0, sizeof(members));
 +
 +                JniContext* ctx = NULL;
 +
 +                std::string errClsName;
 +                int errClsNameLen = 0;
 +                std::string errMsg;
 +                int errMsgLen = 0;
 +
 +                try {
 +                    if (!JVM.GetJvm()) 
 +                    {
 +                        // 1. Create JVM itself.
 +                        jint res = CreateJvm(opts, optsLen, &jvm, &env);
 +
 +                        if (res == JNI_OK)
 +                        {
 +                            // 2. Populate members;
 +                            javaMembers.Initialize(env);
 +                            members.Initialize(env);
 +
 +                            // 3. Register native functions.
 +                            RegisterNatives(env);
 +
 +                            // 4. Create JNI JVM.
 +                            JVM = JniJvm(jvm, javaMembers, members);
 +
 +                            char* printStack = 
getenv("IGNITE_CPP_PRINT_STACK");
 +                            PRINT_EXCEPTION = printStack && strcmp("true", 
printStack) == 0;
 +                        }
 +                        else
 +                        {
 +                            GetJniErrorMessage(errMsg, res);
 +
 +                            errMsgLen = errMsg.length();
 +                        }
 +                    }
 +
 +                    if (JVM.GetJvm())
 +                        ctx = new JniContext(&JVM, hnds);
 +                }
 +                catch (JvmException)
 +                {
 +                    char* errClsNameChars = NULL;
 +                    char* errMsgChars = NULL;
 +
 +                    // Read error info if possible.
 +                    javaMembers.WriteErrorInfo(env, &errClsNameChars, 
&errClsNameLen, &errMsgChars, &errMsgLen);
 +
 +                    if (errClsNameChars) {
 +                        errClsName = errClsNameChars;
 +
 +                        delete[] errClsNameChars;
 +                    }
 +
 +                    if (errMsgChars)
 +                    {
 +                        errMsg = errMsgChars;
 +
 +                        delete[] errMsgChars;
 +                    }
 +
 +                    // Destroy mmebers.
 +                    if (env) {
 +                        members.Destroy(env);
 +                        javaMembers.Destroy(env);
 +                    }
 +
 +                    // Destroy faulty JVM.
 +                    if (jvm)
 +                        jvm->DestroyJavaVM();
 +                }
 +
 +                // It safe to release the lock at this point.
 +                JVM_LOCK.Leave();
 +
 +                // Notify err callback if needed.
 +                if (!ctx) {
 +                    if (errInfo) {
 +                        JniErrorInfo errInfo0(IGNITE_JNI_ERR_JVM_INIT, 
errClsName.c_str(), errMsg.c_str());
 +
 +                        *errInfo = errInfo0;
 +                    }
 +
 +                    if (hnds.error)
 +                        hnds.error(hnds.target, IGNITE_JNI_ERR_JVM_INIT, 
errClsName.c_str(), errClsNameLen,
 +                            errMsg.c_str(), errMsgLen, NULL, 0);
 +                }
 +
 +                return ctx;
 +            }
 +
 +            int JniContext::Reallocate(long long memPtr, int cap) {
 +                JavaVM* jvm = JVM.GetJvm();
 +
 +                JNIEnv* env;
 +
 +                int attachRes = 
jvm->AttachCurrentThread(reinterpret_cast<void**>(&env), NULL);
 +
 +                if (attachRes == JNI_OK)
 +                    AttachHelper::OnThreadAttach();
 +                else
 +                    return -1;
 +
 +                env->CallStaticVoidMethod(JVM.GetMembers().c_PlatformUtils, 
JVM.GetMembers().m_PlatformUtils_reallocate, memPtr, cap);
 +
 +                if (env->ExceptionCheck()) {
 +                    env->ExceptionClear();
 +
 +                    return -1;
 +                }
 +
 +                return 0;
 +            }
 +
 +            void JniContext::Detach() {
 +                gcc::Memory::Fence();
 +
 +                if (JVM.GetJvm()) {
 +                    JNIEnv* env;
 +
 +                    JVM.GetJvm()->GetEnv(reinterpret_cast<void**>(&env), 
JNI_VERSION_1_6);
 +
 +                    if (env)
 +                        JVM.GetJvm()->DetachCurrentThread();
 +                }
 +            }
 +
 +            jobject JniContext::IgnitionStart(char* cfgPath, char* name, int 
factoryId, long long dataPtr) {
 +                return IgnitionStart(cfgPath, name, factoryId, dataPtr, NULL);
 +            }
 +
 +            jobject JniContext::IgnitionStart(char* cfgPath, char* name, int 
factoryId, long long dataPtr, JniErrorInfo* errInfo)
 +            {
 +                JNIEnv* env = Attach();
 +
 +                jstring cfgPath0 = env->NewStringUTF(cfgPath);
 +                jstring name0 = env->NewStringUTF(name);
 +
 +                jobject interop = env->CallStaticObjectMethod(
 +                    jvm->GetMembers().c_PlatformIgnition,
 +                    jvm->GetMembers().m_PlatformIgnition_start,
 +                    cfgPath0,
 +                    name0,
 +                    factoryId,
 +                    reinterpret_cast<long long>(&hnds),
 +                    dataPtr
 +                );
 +
 +                ExceptionCheck(env, errInfo);
 +
 +                return LocalToGlobal(env, interop);
 +            }
 +
 +
 +            jobject JniContext::IgnitionInstance(char* name)
 +            {
 +                return IgnitionInstance(name, NULL);
 +            }
 +
 +            jobject JniContext::IgnitionInstance(char* name, JniErrorInfo* 
errInfo)
 +            {
 +                JNIEnv* env = Attach();
 +
 +                jstring name0 = env->NewStringUTF(name);
 +
 +                jobject interop = 
env->CallStaticObjectMethod(jvm->GetMembers().c_PlatformIgnition,
 +                    jvm->GetMembers().m_PlatformIgnition_instance, name0);
 +
 +                ExceptionCheck(env, errInfo);
 +
 +                return LocalToGlobal(env, interop);
 +            }
 +
 +            long long JniContext::IgnitionEnvironmentPointer(char* name)
 +            {
 +                return IgnitionEnvironmentPointer(name, NULL);
 +            }
 +
 +            long long JniContext::IgnitionEnvironmentPointer(char* name, 
JniErrorInfo* errInfo)
 +            {
 +                JNIEnv* env = Attach();
 +
 +                jstring name0 = env->NewStringUTF(name);
 +
 +                long long res = 
env->CallStaticLongMethod(jvm->GetMembers().c_PlatformIgnition,
 +                    jvm->GetMembers().m_PlatformIgnition_environmentPointer, 
name0);
 +
 +                ExceptionCheck(env, errInfo);
 +
 +                return res;
 +            }
 +
 +            bool JniContext::IgnitionStop(char* name, bool cancel)
 +            {
 +                return IgnitionStop(name, cancel, NULL);
 +            }
 +
 +            bool JniContext::IgnitionStop(char* name, bool cancel, 
JniErrorInfo* errInfo)
 +            {
 +                JNIEnv* env = Attach();
 +
 +                jstring name0 = env->NewStringUTF(name);
 +
 +                jboolean res = 
env->CallStaticBooleanMethod(jvm->GetMembers().c_PlatformIgnition,
 +                    jvm->GetMembers().m_PlatformIgnition_stop, name0, cancel);
 +
 +                ExceptionCheck(env, errInfo);
 +
 +                return res != 0;
 +            }
 +
 +            void JniContext::IgnitionStopAll(bool cancel)
 +            {
 +                return IgnitionStopAll(cancel, NULL);
 +            }
 +
 +            void JniContext::IgnitionStopAll(bool cancel, JniErrorInfo* 
errInfo)
 +            {
 +                JNIEnv* env = Attach();
 +
 +                
env->CallStaticVoidMethod(jvm->GetMembers().c_PlatformIgnition,
 +                    jvm->GetMembers().m_PlatformIgnition_stopAll, cancel);
 +
 +                ExceptionCheck(env, errInfo);
 +            }
 +
 +            void JniContext::ProcessorReleaseStart(jobject obj) {
 +                JNIEnv* env = Attach();
 +
 +                env->CallVoidMethod(obj, 
jvm->GetMembers().m_PlatformProcessor_releaseStart);
 +
 +                ExceptionCheck(env);
 +            }
 +
 +            jobject JniContext::ProcessorProjection(jobject obj) {
 +                JNIEnv* env = Attach();
 +
 +                jobject prj = env->CallObjectMethod(obj, 
jvm->GetMembers().m_PlatformProcessor_projection);
 +
 +                ExceptionCheck(env);
 +
 +                return LocalToGlobal(env, prj);
 +            }
 +
 +            jobject JniContext::ProcessorCache0(jobject obj, const char* 
name, jmethodID mthd, JniErrorInfo* errInfo)
 +            {
 +                JNIEnv* env = Attach();
 +
 +                jstring name0 = name != NULL ? env->NewStringUTF(name) : NULL;
 +
 +                jobject cache = env->CallObjectMethod(obj, mthd, name0);
 +
 +                if (name0)
 +                    env->DeleteLocalRef(name0);
 +
 +                ExceptionCheck(env, errInfo);
 +
 +                return LocalToGlobal(env, cache);
 +            }
 +
 +            jobject JniContext::ProcessorCacheFromConfig0(jobject obj, long 
long memPtr, jmethodID mthd, JniErrorInfo* errInfo)
 +            {
 +                JNIEnv* env = Attach();
 +
 +                jobject cache = env->CallObjectMethod(obj, mthd, memPtr);
 +
 +                ExceptionCheck(env, errInfo);
 +
 +                return LocalToGlobal(env, cache);
 +            }
 +
 +            jobject JniContext::ProcessorCache(jobject obj, const char* name) 
{
 +                return ProcessorCache(obj, name, NULL);
 +            }
 +
 +            jobject JniContext::ProcessorCache(jobject obj, const char* name, 
JniErrorInfo* errInfo) {
 +                return ProcessorCache0(obj, name, 
jvm->GetMembers().m_PlatformProcessor_cache, errInfo);
 +            }
 +
 +            jobject JniContext::ProcessorCreateCache(jobject obj, const char* 
name) {
 +                return ProcessorCreateCache(obj, name, NULL);
 +            }
 +
 +            jobject JniContext::ProcessorCreateCache(jobject obj, const char* 
name, JniErrorInfo* errInfo)
 +            {
 +                return ProcessorCache0(obj, name, 
jvm->GetMembers().m_PlatformProcessor_createCache, errInfo);
 +            }
 +
 +            jobject JniContext::ProcessorGetOrCreateCache(jobject obj, const 
char* name) {
 +                return ProcessorGetOrCreateCache(obj, name, NULL);
 +            }
 +
 +            jobject JniContext::ProcessorGetOrCreateCache(jobject obj, const 
char* name, JniErrorInfo* errInfo)
 +            {
 +                return ProcessorCache0(obj, name, 
jvm->GetMembers().m_PlatformProcessor_getOrCreateCache, errInfo);
 +            }
 +
 +            void JniContext::ProcessorDestroyCache(jobject obj, const char* 
name) {
 +                ProcessorDestroyCache(obj, name, NULL);
 +            }
 +
 +            void JniContext::ProcessorDestroyCache(jobject obj, const char* 
name, JniErrorInfo* errInfo)
 +            {
 +                JNIEnv* env = Attach();
 +
 +                jstring name0 = name != NULL ? env->NewStringUTF(name) : NULL;
 +
 +                env->CallVoidMethod(obj, 
jvm->GetMembers().m_PlatformProcessor_destroyCache, name0);
 +
 +                if (name0)
 +                    env->DeleteLocalRef(name0);
 +
 +                ExceptionCheck(env, errInfo);
 +            }
 +
 +            jobject JniContext::ProcessorCreateCacheFromConfig(jobject obj, 
long long memPtr) {
 +                return ProcessorCreateCacheFromConfig(obj, memPtr, NULL);
 +            }
 +
 +            jobject JniContext::ProcessorCreateCacheFromConfig(jobject obj, 
long long memPtr, JniErrorInfo* errInfo)
 +            {
 +                return ProcessorCacheFromConfig0(obj, memPtr, 
jvm->GetMembers().m_PlatformProcessor_createCacheFromConfig, errInfo);
 +            }
 +
 +            jobject JniContext::ProcessorGetOrCreateCacheFromConfig(jobject 
obj, long long memPtr) {
 +                return ProcessorGetOrCreateCacheFromConfig(obj, memPtr, NULL);
 +            }
 +
 +            jobject JniContext::ProcessorGetOrCreateCacheFromConfig(jobject 
obj, long long memPtr, JniErrorInfo* errInfo)
 +            {
 +                return ProcessorCacheFromConfig0(obj, memPtr, 
jvm->GetMembers().m_PlatformProcessor_getOrCreateCacheFromConfig, errInfo);
 +            }
 +
++            jobject JniContext::ProcessorCreateNearCache(jobject obj, const 
char* name, long long memPtr)
++            {
++                return ProcessorGetOrCreateNearCache0(obj, name, memPtr, 
jvm->GetMembers().m_PlatformProcessor_createNearCache);
++            }
++
++            jobject JniContext::ProcessorGetOrCreateNearCache(jobject obj, 
const char* name, long long memPtr)
++            {
++                return ProcessorGetOrCreateNearCache0(obj, name, memPtr, 
jvm->GetMembers().m_PlatformProcessor_getOrCreateNearCache);
++            }
++
++            jobject JniContext::ProcessorGetOrCreateNearCache0(jobject obj, 
const char* name, long long memPtr, jmethodID methodID)
++            {
++                JNIEnv* env = Attach();
++
++                jstring name0 = name != NULL ? env->NewStringUTF(name) : NULL;
++
++                jobject cache = env->CallObjectMethod(obj, methodID, name0, 
memPtr);
++
++                if (name0)
++                    env->DeleteLocalRef(name0);
++
++                ExceptionCheck(env);
++
++                return LocalToGlobal(env, cache);
++            }
++
 +            jobject JniContext::ProcessorAffinity(jobject obj, const char* 
name) {
 +                JNIEnv* env = Attach();
 +
 +                jstring name0 = name != NULL ? env->NewStringUTF(name) : NULL;
 +
 +                jobject aff = env->CallObjectMethod(obj, 
jvm->GetMembers().m_PlatformProcessor_affinity, name0);
 +
 +                if (name0)
 +                    env->DeleteLocalRef(name0);
 +
 +                ExceptionCheck(env);
 +
 +                return LocalToGlobal(env, aff);
 +            }
 +
 +            jobject JniContext::ProcessorDataStreamer(jobject obj, const 
char* name, bool keepPortable) {
 +                JNIEnv* env = Attach();
 +
 +                jstring name0 = name != NULL ? env->NewStringUTF(name) : NULL;
 +
 +                jobject ldr = env->CallObjectMethod(obj, 
jvm->GetMembers().m_PlatformProcessor_dataStreamer, name0,
 +                    keepPortable);
 +
 +                if (name0)
 +                    env->DeleteLocalRef(name0);
 +
 +                ExceptionCheck(env);
 +
 +                return LocalToGlobal(env, ldr);
 +            }
 +
 +            jobject JniContext::ProcessorTransactions(jobject obj) {
 +                JNIEnv* env = Attach();
 +
 +                jobject tx = env->CallObjectMethod(obj, 
jvm->GetMembers().m_PlatformProcessor_transactions);
 +
 +                ExceptionCheck(env);
 +
 +                return LocalToGlobal(env, tx);
 +            }
 +
 +            jobject JniContext::ProcessorCompute(jobject obj, jobject prj) {
 +                JNIEnv* env = Attach();
 +
 +                jobject res = env->CallObjectMethod(obj, 
jvm->GetMembers().m_PlatformProcessor_compute, prj);
 +
 +                ExceptionCheck(env);
 +
 +                return LocalToGlobal(env, res);
 +            }
 +
 +            jobject JniContext::ProcessorMessage(jobject obj, jobject prj) {
 +                JNIEnv* env = Attach();
 +
 +                jobject res = env->CallObjectMethod(obj, 
jvm->GetMembers().m_PlatformProcessor_message, prj);
 +
 +                ExceptionCheck(env);
 +
 +                return LocalToGlobal(env, res);
 +            }
 +
 +            jobject JniContext::ProcessorEvents(jobject obj, jobject prj) {
 +                JNIEnv* env = Attach();
 +
 +                jobject res = env->CallObjectMethod(obj, 
jvm->GetMembers().m_PlatformProcessor_events, prj);
 +
 +                ExceptionCheck(env);
 +
 +                return LocalToGlobal(env, res);
 +            }
 +
 +            jobject JniContext::ProcessorServices(jobject obj, jobject prj) {
 +                JNIEnv* env = Attach();
 +
 +                jobject res = env->CallObjectMethod(obj, 
jvm->GetMembers().m_PlatformProcessor_services, prj);
 +
 +                ExceptionCheck(env);
 +
 +                return LocalToGlobal(env, res);
 +            }
 +
 +            jobject JniContext::ProcessorExtensions(jobject obj)
 +            {
 +                JNIEnv* env = Attach();
 +
 +                jobject res = env->CallObjectMethod(obj, 
jvm->GetMembers().m_PlatformProcessor_extensions);
 +
 +                ExceptionCheck(env);
 +
 +                return LocalToGlobal(env, res);
 +            }
 +
 +            jobject JniContext::ProcessorAtomicLong(jobject obj, char* name, 
long long initVal, bool create)
 +            {
 +                JNIEnv* env = Attach();
 +
 +                jstring name0 = name != NULL ? env->NewStringUTF(name) : NULL;
 +
 +                jobject res = env->CallObjectMethod(obj, 
jvm->GetMembers().m_PlatformProcessor_atomicLong, name0, initVal, create);
 +
 +                if (name0)
 +                    env->DeleteLocalRef(name0);
 +
 +                ExceptionCheck(env);
 +
 +                return LocalToGlobal(env, res);
 +            }
 +
 +            jobject JniContext::ProcessorAtomicSequence(jobject obj, char* 
name, long long initVal, bool create)
 +            {
 +                JNIEnv* env = Attach();
 +
 +                jstring name0 = name != NULL ? env->NewStringUTF(name) : NULL;
 +
 +                jobject res = env->CallObjectMethod(obj, 
jvm->GetMembers().m_PlatformProcessor_atomicSequence, name0, initVal, create);
 +
 +                if (name0)
 +                    env->DeleteLocalRef(name0);
 +
 +                ExceptionCheck(env);
 +
 +                return LocalToGlobal(env, res);
 +            }
 +
 +            jobject JniContext::ProcessorAtomicReference(jobject obj, char* 
name, long long memPtr, bool create)
 +            {
 +                JNIEnv* env = Attach();
 +
 +                jstring name0 = name != NULL ? env->NewStringUTF(name) : NULL;
 +
 +                jobject res = env->CallObjectMethod(obj, 
jvm->GetMembers().m_PlatformProcessor_atomicReference, name0, memPtr, create);
 +
 +                if (name0)
 +                    env->DeleteLocalRef(name0);
 +
 +                ExceptionCheck(env);
 +
 +                return LocalToGlobal(env, res);
 +            }
 +
 +            void JniContext::ProcessorGetIgniteConfiguration(jobject obj, 
long long memPtr)
 +            {
 +                JNIEnv* env = Attach();
 +
 +                env->CallVoidMethod(obj, 
jvm->GetMembers().m_PlatformProcessor_getIgniteConfiguration, memPtr);
 +
 +                ExceptionCheck(env);
 +            }
 +
 +            long long JniContext::TargetInStreamOutLong(jobject obj, int 
opType, long long memPtr, JniErrorInfo* err) {
 +                JNIEnv* env = Attach();
 +
 +                long long res = env->CallLongMethod(obj, 
jvm->GetMembers().m_PlatformTarget_inStreamOutLong, opType, memPtr);
 +
 +                ExceptionCheck(env, err);
 +
 +                return res;
 +            }
 +
 +            void JniContext::TargetInStreamOutStream(jobject obj, int opType, 
long long inMemPtr, long long outMemPtr, JniErrorInfo* err) {
 +                JNIEnv* env = Attach();
 +
 +                env->CallVoidMethod(obj, 
jvm->GetMembers().m_PlatformTarget_inStreamOutStream, opType, inMemPtr, 
outMemPtr);
 +
 +                ExceptionCheck(env, err);
 +            }
 +
 +           jobject JniContext::TargetInStreamOutObject(jobject obj, int 
opType, long long memPtr, JniErrorInfo* err) {
 +                JNIEnv* env = Attach();
 +
 +                jobject res = env->CallObjectMethod(obj, 
jvm->GetMembers().m_PlatformTarget_inStreamOutObject, opType, memPtr);
 +
 +                ExceptionCheck(env, err);
 +
 +                return LocalToGlobal(env, res);
 +            }
 +
 +            void JniContext::TargetInObjectStreamOutStream(jobject obj, int 
opType, void* arg, long long inMemPtr, long long outMemPtr, JniErrorInfo* err) {
 +                JNIEnv* env = Attach();
 +
 +                env->CallVoidMethod(obj, 
jvm->GetMembers().m_PlatformTarget_inObjectStreamOutStream, opT

<TRUNCATED>

Reply via email to