mirror of
https://github.com/zerotier/ZeroTierOne.git
synced 2025-06-06 20:43:44 +02:00
JniRef work
JniRef does not use callbacks struct, so remove fix NewGlobalRef / DeleteGlobalRef mismatch
This commit is contained in:
parent
d28f44335a
commit
a2f753986b
1 changed files with 72 additions and 76 deletions
|
@ -43,22 +43,39 @@
|
||||||
namespace {
|
namespace {
|
||||||
struct JniRef
|
struct JniRef
|
||||||
{
|
{
|
||||||
JniRef()
|
JniRef(
|
||||||
: jvm(NULL)
|
int64_t id,
|
||||||
, node(NULL)
|
JavaVM *jvm,
|
||||||
, dataStoreGetListener(NULL)
|
jobject dataStoreGetListenerLocalIn,
|
||||||
, dataStorePutListener(NULL)
|
jobject dataStorePutListenerLocalIn,
|
||||||
, packetSender(NULL)
|
jobject packetSenderLocalIn,
|
||||||
, eventListener(NULL)
|
jobject eventListenerLocalIn,
|
||||||
, frameListener(NULL)
|
jobject frameListenerLocalIn,
|
||||||
, configListener(NULL)
|
jobject configListenerLocalIn,
|
||||||
, pathChecker(NULL)
|
jobject pathCheckerLocalIn)
|
||||||
, callbacks(NULL)
|
: id(id)
|
||||||
, inited()
|
, jvm(jvm)
|
||||||
{
|
, node()
|
||||||
callbacks = (ZT_Node_Callbacks*)malloc(sizeof(ZT_Node_Callbacks));
|
, dataStoreGetListener()
|
||||||
memset(callbacks, 0, sizeof(ZT_Node_Callbacks));
|
, dataStorePutListener()
|
||||||
}
|
, packetSender()
|
||||||
|
, eventListener()
|
||||||
|
, frameListener()
|
||||||
|
, configListener()
|
||||||
|
, pathChecker()
|
||||||
|
, inited() {
|
||||||
|
|
||||||
|
JNIEnv *env;
|
||||||
|
GETENV(env, jvm);
|
||||||
|
|
||||||
|
dataStoreGetListener = env->NewGlobalRef(dataStoreGetListenerLocalIn);
|
||||||
|
dataStorePutListener = env->NewGlobalRef(dataStorePutListenerLocalIn);
|
||||||
|
packetSender = env->NewGlobalRef(packetSenderLocalIn);
|
||||||
|
eventListener = env->NewGlobalRef(eventListenerLocalIn);
|
||||||
|
frameListener = env->NewGlobalRef(frameListenerLocalIn);
|
||||||
|
configListener = env->NewGlobalRef(configListenerLocalIn);
|
||||||
|
pathChecker = env->NewGlobalRef(pathCheckerLocalIn);
|
||||||
|
};
|
||||||
|
|
||||||
~JniRef()
|
~JniRef()
|
||||||
{
|
{
|
||||||
|
@ -72,9 +89,6 @@ namespace {
|
||||||
env->DeleteGlobalRef(frameListener);
|
env->DeleteGlobalRef(frameListener);
|
||||||
env->DeleteGlobalRef(configListener);
|
env->DeleteGlobalRef(configListener);
|
||||||
env->DeleteGlobalRef(pathChecker);
|
env->DeleteGlobalRef(pathChecker);
|
||||||
|
|
||||||
free(callbacks);
|
|
||||||
callbacks = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t id;
|
int64_t id;
|
||||||
|
@ -91,8 +105,6 @@ namespace {
|
||||||
jobject configListener;
|
jobject configListener;
|
||||||
jobject pathChecker;
|
jobject pathChecker;
|
||||||
|
|
||||||
ZT_Node_Callbacks *callbacks;
|
|
||||||
|
|
||||||
bool inited;
|
bool inited;
|
||||||
|
|
||||||
bool finishInitializing();
|
bool finishInitializing();
|
||||||
|
@ -603,66 +615,50 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_node_1init(
|
||||||
LOGV("Creating ZT_Node struct");
|
LOGV("Creating ZT_Node struct");
|
||||||
jobject resultObject = ResultCode_RESULT_OK_enum;
|
jobject resultObject = ResultCode_RESULT_OK_enum;
|
||||||
|
|
||||||
|
JavaVM *vm;
|
||||||
|
GETJAVAVM(env, vm);
|
||||||
|
|
||||||
|
assert(dataStoreGetListener != NULL);
|
||||||
|
assert(dataStorePutListener != NULL);
|
||||||
|
assert(packetSender != NULL);
|
||||||
|
assert(frameListener != NULL);
|
||||||
|
assert(configListener != NULL);
|
||||||
|
assert(eventListener != NULL);
|
||||||
|
//
|
||||||
|
// OPTIONAL, pathChecker may be NULL
|
||||||
|
//
|
||||||
|
// assert(pathChecker != NULL);
|
||||||
|
|
||||||
|
ZT_Node_Callbacks callbacks{};
|
||||||
|
callbacks.stateGetFunction = &StateGetFunction;
|
||||||
|
callbacks.statePutFunction = &StatePutFunction;
|
||||||
|
callbacks.wirePacketSendFunction = &WirePacketSendFunction;
|
||||||
|
callbacks.virtualNetworkFrameFunction = &VirtualNetworkFrameFunctionCallback;
|
||||||
|
callbacks.virtualNetworkConfigFunction = &VirtualNetworkConfigFunctionCallback;
|
||||||
|
callbacks.eventCallback = &EventCallback;
|
||||||
|
callbacks.pathCheckFunction = &PathCheckFunction;
|
||||||
|
callbacks.pathLookupFunction = &PathLookupFunction;
|
||||||
|
|
||||||
|
//
|
||||||
|
// a bit of a confusing dance here where ref and node both know about each other
|
||||||
|
//
|
||||||
|
JniRef *ref = new JniRef(
|
||||||
|
now,
|
||||||
|
vm,
|
||||||
|
dataStoreGetListener,
|
||||||
|
dataStorePutListener,
|
||||||
|
packetSender,
|
||||||
|
eventListener,
|
||||||
|
frameListener,
|
||||||
|
configListener,
|
||||||
|
pathChecker);
|
||||||
|
|
||||||
ZT_Node *node;
|
ZT_Node *node;
|
||||||
JniRef *ref = new JniRef;
|
|
||||||
ref->id = (int64_t)now;
|
|
||||||
GETJAVAVM(env, ref->jvm);
|
|
||||||
|
|
||||||
if(dataStoreGetListener == NULL)
|
|
||||||
{
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
ref->dataStoreGetListener = env->NewGlobalRef(dataStoreGetListener);
|
|
||||||
|
|
||||||
if(dataStorePutListener == NULL)
|
|
||||||
{
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
ref->dataStorePutListener = env->NewGlobalRef(dataStorePutListener);
|
|
||||||
|
|
||||||
if(packetSender == NULL)
|
|
||||||
{
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
ref->packetSender = env->NewGlobalRef(packetSender);
|
|
||||||
|
|
||||||
if(frameListener == NULL)
|
|
||||||
{
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
ref->frameListener = env->NewGlobalRef(frameListener);
|
|
||||||
|
|
||||||
if(configListener == NULL)
|
|
||||||
{
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
ref->configListener = env->NewGlobalRef(configListener);
|
|
||||||
|
|
||||||
if(eventListener == NULL)
|
|
||||||
{
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
ref->eventListener = env->NewGlobalRef(eventListener);
|
|
||||||
|
|
||||||
if(pathChecker != NULL)
|
|
||||||
{
|
|
||||||
ref->pathChecker = env->NewGlobalRef(pathChecker);
|
|
||||||
}
|
|
||||||
|
|
||||||
ref->callbacks->stateGetFunction = &StateGetFunction;
|
|
||||||
ref->callbacks->statePutFunction = &StatePutFunction;
|
|
||||||
ref->callbacks->wirePacketSendFunction = &WirePacketSendFunction;
|
|
||||||
ref->callbacks->virtualNetworkFrameFunction = &VirtualNetworkFrameFunctionCallback;
|
|
||||||
ref->callbacks->virtualNetworkConfigFunction = &VirtualNetworkConfigFunctionCallback;
|
|
||||||
ref->callbacks->eventCallback = &EventCallback;
|
|
||||||
ref->callbacks->pathCheckFunction = &PathCheckFunction;
|
|
||||||
ref->callbacks->pathLookupFunction = &PathLookupFunction;
|
|
||||||
|
|
||||||
ZT_ResultCode rc = ZT_Node_new(
|
ZT_ResultCode rc = ZT_Node_new(
|
||||||
&node,
|
&node,
|
||||||
ref,
|
ref,
|
||||||
NULL,
|
NULL,
|
||||||
ref->callbacks,
|
&callbacks,
|
||||||
(int64_t)now);
|
(int64_t)now);
|
||||||
|
|
||||||
if(rc != ZT_RESULT_OK)
|
if(rc != ZT_RESULT_OK)
|
||||||
|
|
Loading…
Add table
Reference in a new issue