Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id 932842009F4 for ; Thu, 5 May 2016 21:37:41 +0200 (CEST) Received: by cust-asf.ponee.io (Postfix) id 91DA4160A04; Thu, 5 May 2016 19:37:41 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id 794D6160A0B for ; Thu, 5 May 2016 21:37:38 +0200 (CEST) Received: (qmail 52431 invoked by uid 500); 5 May 2016 19:37:37 -0000 Mailing-List: contact commits-help@ignite.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@ignite.apache.org Delivered-To: mailing list commits@ignite.apache.org Received: (qmail 51763 invoked by uid 99); 5 May 2016 19:37:36 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 05 May 2016 19:37:36 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 444ECE9429; Thu, 5 May 2016 19:37:36 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: dmagda@apache.org To: commits@ignite.apache.org Date: Thu, 05 May 2016 19:37:48 -0000 Message-Id: <39404ca517fe4011a758323d7f828deb@git.apache.org> In-Reply-To: <157de727a73f4c6fae12667d5751dc81@git.apache.org> References: <157de727a73f4c6fae12667d5751dc81@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [14/40] ignite git commit: IGNITE-1786: Implemented ODBC driver. archived-at: Thu, 05 May 2016 19:37:41 -0000 http://git-wip-us.apache.org/repos/asf/ignite/blob/764c97b9/modules/platforms/cpp/jni/src/java.cpp ---------------------------------------------------------------------- diff --git a/modules/platforms/cpp/jni/src/java.cpp b/modules/platforms/cpp/jni/src/java.cpp new file mode 100644 index 0000000..95fa9cb --- /dev/null +++ b/modules/platforms/cpp/jni/src/java.cpp @@ -0,0 +1,2823 @@ +/* + * 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 +#include +#include + +#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(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(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(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(name); + this->sign = const_cast(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); + JniMethod M_PLATFORM_PROCESSOR_GET_CACHE_NAMES = JniMethod("getCacheNames", "(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(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(env->CallObjectMethod(errCls, m_Class_getName)); + *errClsName = StringToChars(env, clsName, errClsNameLen); + + jstring msg = static_cast(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); + m_PlatformProcessor_getCacheNames = FindMethod(env, c_PlatformProcessor, M_PLATFORM_PROCESSOR_GET_CACHE_NAMES); + + 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(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(JniCacheStoreCreate)); + AddNativeMethod(methods + idx++, M_PLATFORM_CALLBACK_UTILS_CACHE_STORE_INVOKE, reinterpret_cast(JniCacheStoreInvoke)); + AddNativeMethod(methods + idx++, M_PLATFORM_CALLBACK_UTILS_CACHE_STORE_DESTROY, reinterpret_cast(JniCacheStoreDestroy)); + + AddNativeMethod(methods + idx++, M_PLATFORM_CALLBACK_UTILS_CACHE_STORE_SESSION_CREATE, reinterpret_cast(JniCacheStoreSessionCreate)); + + AddNativeMethod(methods + idx++, M_PLATFORM_CALLBACK_UTILS_CACHE_ENTRY_FILTER_CREATE, reinterpret_cast(JniCacheEntryFilterCreate)); + AddNativeMethod(methods + idx++, M_PLATFORM_CALLBACK_UTILS_CACHE_ENTRY_FILTER_APPLY, reinterpret_cast(JniCacheEntryFilterApply)); + AddNativeMethod(methods + idx++, M_PLATFORM_CALLBACK_UTILS_CACHE_ENTRY_FILTER_DESTROY, reinterpret_cast(JniCacheEntryFilterDestroy)); + + AddNativeMethod(methods + idx++, M_PLATFORM_CALLBACK_UTILS_CACHE_INVOKE, reinterpret_cast(JniCacheInvoke)); + + AddNativeMethod(methods + idx++, M_PLATFORM_CALLBACK_UTILS_COMPUTE_TASK_MAP, reinterpret_cast(JniComputeTaskMap)); + AddNativeMethod(methods + idx++, M_PLATFORM_CALLBACK_UTILS_COMPUTE_TASK_JOB_RESULT, reinterpret_cast(JniComputeTaskJobResult)); + AddNativeMethod(methods + idx++, M_PLATFORM_CALLBACK_UTILS_COMPUTE_TASK_REDUCE, reinterpret_cast(JniComputeTaskReduce)); + AddNativeMethod(methods + idx++, M_PLATFORM_CALLBACK_UTILS_COMPUTE_TASK_COMPLETE, reinterpret_cast(JniComputeTaskComplete)); + + AddNativeMethod(methods + idx++, M_PLATFORM_CALLBACK_UTILS_COMPUTE_JOB_SERIALIZE, reinterpret_cast(JniComputeJobSerialize)); + AddNativeMethod(methods + idx++, M_PLATFORM_CALLBACK_UTILS_COMPUTE_JOB_CREATE, reinterpret_cast(JniComputeJobCreate)); + AddNativeMethod(methods + idx++, M_PLATFORM_CALLBACK_UTILS_COMPUTE_JOB_EXECUTE, reinterpret_cast(JniComputeJobExecute)); + AddNativeMethod(methods + idx++, M_PLATFORM_CALLBACK_UTILS_COMPUTE_JOB_DESTROY, reinterpret_cast(JniComputeJobDestroy)); + AddNativeMethod(methods + idx++, M_PLATFORM_CALLBACK_UTILS_COMPUTE_JOB_CANCEL, reinterpret_cast(JniComputeJobCancel)); + + AddNativeMethod(methods + idx++, M_PLATFORM_CALLBACK_UTILS_CONTINUOUS_QUERY_LSNR_APPLY, reinterpret_cast(JniContinuousQueryListenerApply)); + AddNativeMethod(methods + idx++, M_PLATFORM_CALLBACK_UTILS_CONTINUOUS_QUERY_FILTER_CREATE, reinterpret_cast(JniContinuousQueryFilterCreate)); + AddNativeMethod(methods + idx++, M_PLATFORM_CALLBACK_UTILS_CONTINUOUS_QUERY_FILTER_EVAL, reinterpret_cast(JniContinuousQueryFilterApply)); + AddNativeMethod(methods + idx++, M_PLATFORM_CALLBACK_UTILS_CONTINUOUS_QUERY_FILTER_RELEASE, reinterpret_cast(JniContinuousQueryFilterRelease)); + + AddNativeMethod(methods + idx++, M_PLATFORM_CALLBACK_UTILS_DATA_STREAMER_TOPOLOGY_UPDATE, reinterpret_cast(JniDataStreamerTopologyUpdate)); + AddNativeMethod(methods + idx++, M_PLATFORM_CALLBACK_UTILS_DATA_STREAMER_STREAM_RECEIVER_INVOKE, reinterpret_cast(JniDataStreamerStreamReceiverInvoke)); + + AddNativeMethod(methods + idx++, M_PLATFORM_CALLBACK_UTILS_FUTURE_BYTE_RES, reinterpret_cast(JniFutureByteResult)); + AddNativeMethod(methods + idx++, M_PLATFORM_CALLBACK_UTILS_FUTURE_BOOL_RES, reinterpret_cast(JniFutureBoolResult)); + AddNativeMethod(methods + idx++, M_PLATFORM_CALLBACK_UTILS_FUTURE_SHORT_RES, reinterpret_cast(JniFutureShortResult)); + AddNativeMethod(methods + idx++, M_PLATFORM_CALLBACK_UTILS_FUTURE_CHAR_RES, reinterpret_cast(JniFutureCharResult)); + AddNativeMethod(methods + idx++, M_PLATFORM_CALLBACK_UTILS_FUTURE_INT_RES, reinterpret_cast(JniFutureIntResult)); + AddNativeMethod(methods + idx++, M_PLATFORM_CALLBACK_UTILS_FUTURE_FLOAT_RES, reinterpret_cast(JniFutureFloatResult)); + AddNativeMethod(methods + idx++, M_PLATFORM_CALLBACK_UTILS_FUTURE_LONG_RES, reinterpret_cast(JniFutureLongResult)); + AddNativeMethod(methods + idx++, M_PLATFORM_CALLBACK_UTILS_FUTURE_DOUBLE_RES, reinterpret_cast(JniFutureDoubleResult)); + AddNativeMethod(methods + idx++, M_PLATFORM_CALLBACK_UTILS_FUTURE_OBJ_RES, reinterpret_cast(JniFutureObjectResult)); + AddNativeMethod(methods + idx++, M_PLATFORM_CALLBACK_UTILS_FUTURE_NULL_RES, reinterpret_cast(JniFutureNullResult)); + AddNativeMethod(methods + idx++, M_PLATFORM_CALLBACK_UTILS_FUTURE_ERR, reinterpret_cast(JniFutureError)); + + AddNativeMethod(methods + idx++, M_PLATFORM_CALLBACK_UTILS_LIFECYCLE_EVENT, reinterpret_cast(JniLifecycleEvent)); + + AddNativeMethod(methods + idx++, M_PLATFORM_CALLBACK_UTILS_MESSAGING_FILTER_CREATE, reinterpret_cast(JniMessagingFilterCreate)); + AddNativeMethod(methods + idx++, M_PLATFORM_CALLBACK_UTILS_MESSAGING_FILTER_APPLY, reinterpret_cast(JniMessagingFilterApply)); + AddNativeMethod(methods + idx++, M_PLATFORM_CALLBACK_UTILS_MESSAGING_FILTER_DESTROY, reinterpret_cast(JniMessagingFilterDestroy)); + + AddNativeMethod(methods + idx++, M_PLATFORM_CALLBACK_UTILS_EVENT_FILTER_CREATE, reinterpret_cast(JniEventFilterCreate)); + AddNativeMethod(methods + idx++, M_PLATFORM_CALLBACK_UTILS_EVENT_FILTER_APPLY, reinterpret_cast(JniEventFilterApply)); + AddNativeMethod(methods + idx++, M_PLATFORM_CALLBACK_UTILS_EVENT_FILTER_DESTROY, reinterpret_cast(JniEventFilterDestroy)); + + AddNativeMethod(methods + idx++, M_PLATFORM_CALLBACK_UTILS_SERVICE_INIT, reinterpret_cast(JniServiceInit)); + AddNativeMethod(methods + idx++, M_PLATFORM_CALLBACK_UTILS_SERVICE_EXECUTE, reinterpret_cast(JniServiceExecute)); + AddNativeMethod(methods + idx++, M_PLATFORM_CALLBACK_UTILS_SERVICE_CANCEL, reinterpret_cast(JniServiceCancel)); + AddNativeMethod(methods + idx++, M_PLATFORM_CALLBACK_UTILS_SERVICE_INVOKE_METHOD, reinterpret_cast(JniServiceInvokeMethod)); + + AddNativeMethod(methods + idx++, M_PLATFORM_CALLBACK_UTILS_CLUSTER_NODE_FILTER_APPLY, reinterpret_cast(JniClusterNodeFilterApply)); + + AddNativeMethod(methods + idx++, M_PLATFORM_CALLBACK_UTILS_NODE_INFO, reinterpret_cast(JniNodeInfo)); + + AddNativeMethod(methods + idx++, M_PLATFORM_CALLBACK_UTILS_MEMORY_REALLOCATE, reinterpret_cast(JniMemoryReallocate)); + + AddNativeMethod(methods + idx++, M_PLATFORM_CALLBACK_UTILS_ON_START, reinterpret_cast(JniOnStart)); + AddNativeMethod(methods + idx++, M_PLATFORM_CALLBACK_UTILS_ON_STOP, reinterpret_cast(JniOnStop)); + + AddNativeMethod(methods + idx++, M_PLATFORM_CALLBACK_UTILS_EXTENSION_CALLBACK_IN_LONG_OUT_LONG, reinterpret_cast(JniExtensionCallbackInLongOutLong)); + AddNativeMethod(methods + idx++, M_PLATFORM_CALLBACK_UTILS_EXTENSION_CALLBACK_IN_LONG_LONG_OUT_LONG, reinterpret_cast(JniExtensionCallbackInLongLongOutLong)); + + AddNativeMethod(methods + idx++, M_PLATFORM_CALLBACK_UTILS_ON_CLIENT_DISCONNECTED, reinterpret_cast(JniOnClientDisconnected)); + AddNativeMethod(methods + idx++, M_PLATFORM_CALLBACK_UTILS_ON_CLIENT_RECONNECTED, reinterpret_cast(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(&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(&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(&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); + } + + void JniContext::ProcessorGetCacheNames(jobject obj, long long memPtr) + { + JNIEnv* env = Attach(); + + env->CallVoidMethod(obj, jvm->GetMembers().m_PlatformProcessor_getCacheNames, 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, opType, arg, inMemPtr, outMemPtr); + + ExceptionCheck(env, err); + } + + long long JniContext::TargetOutLong(jobject obj, int opType, JniErrorInfo* err) + { + JNIEnv* env = Attach(); + + jlong res = env->CallLongMethod(obj, jvm->GetMembers().m_PlatformTarget_outLong, opType); + + ExceptionCheck(env, err); + + return res; + } + + void JniContext::TargetOutStream(jobject obj, int opType, long long memPtr, JniErrorInfo* err) { + JNIEnv* env = Attach(); + + env->CallVoidMethod(obj, jvm->GetMembers().m_PlatformTarget_outStream, opType, memPtr); + + ExceptionCheck(env, err); + } + + jobject JniContext::TargetOutObject(jobject obj, int opType, JniErrorInfo* err) + { + JNIEnv* env = Attach(); + + jobject res = env->CallObjectMethod(obj, jvm->GetMem