diff --git a/java/jni/ZT_jnicache.cpp b/java/jni/ZT_jnicache.cpp index daaf803e6..a29bd8e74 100644 --- a/java/jni/ZT_jnicache.cpp +++ b/java/jni/ZT_jnicache.cpp @@ -105,6 +105,7 @@ jmethodID VirtualNetworkRoute_ctor; jmethodID Event_fromInt_method; jmethodID InetAddress_getByAddress_method; jmethodID PeerRole_fromInt_method; +jmethodID ResultCode_fromInt_method; // // Instance fields @@ -160,13 +161,6 @@ jfieldID VirtualNetworkRoute_via_field; // Static fields // -jfieldID ResultCode_RESULT_ERROR_BAD_PARAMETER_field; -jfieldID ResultCode_RESULT_ERROR_NETWORK_NOT_FOUND_field; -jfieldID ResultCode_RESULT_ERROR_UNSUPPORTED_OPERATION_field; -jfieldID ResultCode_RESULT_FATAL_ERROR_DATA_STORE_FAILED_field; -jfieldID ResultCode_RESULT_FATAL_ERROR_INTERNAL_field; -jfieldID ResultCode_RESULT_FATAL_ERROR_OUT_OF_MEMORY_field; -jfieldID ResultCode_RESULT_OK_field; jfieldID VirtualNetworkConfigOperation_VIRTUAL_NETWORK_CONFIG_OPERATION_CONFIG_UPDATE_field; jfieldID VirtualNetworkConfigOperation_VIRTUAL_NETWORK_CONFIG_OPERATION_DESTROY_field; jfieldID VirtualNetworkConfigOperation_VIRTUAL_NETWORK_CONFIG_OPERATION_DOWN_field; @@ -259,6 +253,7 @@ void setupJNICache(JavaVM *vm) { EXCEPTIONANDNULLCHECK(Event_fromInt_method = env->GetStaticMethodID(Event_class, "fromInt", "(I)Lcom/zerotier/sdk/Event;")); EXCEPTIONANDNULLCHECK(InetAddress_getByAddress_method = env->GetStaticMethodID(InetAddress_class, "getByAddress", "([B)Ljava/net/InetAddress;")); EXCEPTIONANDNULLCHECK(PeerRole_fromInt_method = env->GetStaticMethodID(PeerRole_class, "fromInt", "(I)Lcom/zerotier/sdk/PeerRole;")); + EXCEPTIONANDNULLCHECK(ResultCode_fromInt_method = env->GetStaticMethodID(ResultCode_class, "fromInt", "(I)Lcom/zerotier/sdk/ResultCode;")); // // Instance fields @@ -314,13 +309,6 @@ void setupJNICache(JavaVM *vm) { // Static fields // - EXCEPTIONANDNULLCHECK(ResultCode_RESULT_ERROR_BAD_PARAMETER_field = env->GetStaticFieldID(ResultCode_class, "RESULT_ERROR_BAD_PARAMETER", "Lcom/zerotier/sdk/ResultCode;")); - EXCEPTIONANDNULLCHECK(ResultCode_RESULT_ERROR_NETWORK_NOT_FOUND_field = env->GetStaticFieldID(ResultCode_class, "RESULT_ERROR_NETWORK_NOT_FOUND", "Lcom/zerotier/sdk/ResultCode;")); - EXCEPTIONANDNULLCHECK(ResultCode_RESULT_ERROR_UNSUPPORTED_OPERATION_field = env->GetStaticFieldID(ResultCode_class, "RESULT_ERROR_UNSUPPORTED_OPERATION", "Lcom/zerotier/sdk/ResultCode;")); - EXCEPTIONANDNULLCHECK(ResultCode_RESULT_FATAL_ERROR_DATA_STORE_FAILED_field = env->GetStaticFieldID(ResultCode_class, "RESULT_FATAL_ERROR_DATA_STORE_FAILED", "Lcom/zerotier/sdk/ResultCode;")); - EXCEPTIONANDNULLCHECK(ResultCode_RESULT_FATAL_ERROR_INTERNAL_field = env->GetStaticFieldID(ResultCode_class, "RESULT_FATAL_ERROR_INTERNAL", "Lcom/zerotier/sdk/ResultCode;")); - EXCEPTIONANDNULLCHECK(ResultCode_RESULT_FATAL_ERROR_OUT_OF_MEMORY_field = env->GetStaticFieldID(ResultCode_class, "RESULT_FATAL_ERROR_OUT_OF_MEMORY", "Lcom/zerotier/sdk/ResultCode;")); - EXCEPTIONANDNULLCHECK(ResultCode_RESULT_OK_field = env->GetStaticFieldID(ResultCode_class, "RESULT_OK", "Lcom/zerotier/sdk/ResultCode;")); EXCEPTIONANDNULLCHECK(VirtualNetworkConfigOperation_VIRTUAL_NETWORK_CONFIG_OPERATION_CONFIG_UPDATE_field = env->GetStaticFieldID(VirtualNetworkConfigOperation_class, "VIRTUAL_NETWORK_CONFIG_OPERATION_CONFIG_UPDATE", "Lcom/zerotier/sdk/VirtualNetworkConfigOperation;")); EXCEPTIONANDNULLCHECK(VirtualNetworkConfigOperation_VIRTUAL_NETWORK_CONFIG_OPERATION_DESTROY_field = env->GetStaticFieldID(VirtualNetworkConfigOperation_class, "VIRTUAL_NETWORK_CONFIG_OPERATION_DESTROY", "Lcom/zerotier/sdk/VirtualNetworkConfigOperation;")); EXCEPTIONANDNULLCHECK(VirtualNetworkConfigOperation_VIRTUAL_NETWORK_CONFIG_OPERATION_DOWN_field = env->GetStaticFieldID(VirtualNetworkConfigOperation_class, "VIRTUAL_NETWORK_CONFIG_OPERATION_DOWN", "Lcom/zerotier/sdk/VirtualNetworkConfigOperation;")); diff --git a/java/jni/ZT_jnicache.h b/java/jni/ZT_jnicache.h index c79fe1db5..ffee04d93 100644 --- a/java/jni/ZT_jnicache.h +++ b/java/jni/ZT_jnicache.h @@ -74,6 +74,7 @@ extern jmethodID VirtualNetworkRoute_ctor; extern jmethodID Event_fromInt_method; extern jmethodID InetAddress_getByAddress_method; extern jmethodID PeerRole_fromInt_method; +extern jmethodID ResultCode_fromInt_method; // // Instance fields @@ -129,13 +130,6 @@ extern jfieldID VirtualNetworkRoute_via_field; // Static fields // -extern jfieldID ResultCode_RESULT_ERROR_BAD_PARAMETER_field; -extern jfieldID ResultCode_RESULT_ERROR_NETWORK_NOT_FOUND_field; -extern jfieldID ResultCode_RESULT_ERROR_UNSUPPORTED_OPERATION_field; -extern jfieldID ResultCode_RESULT_FATAL_ERROR_DATA_STORE_FAILED_field; -extern jfieldID ResultCode_RESULT_FATAL_ERROR_INTERNAL_field; -extern jfieldID ResultCode_RESULT_FATAL_ERROR_OUT_OF_MEMORY_field; -extern jfieldID ResultCode_RESULT_OK_field; extern jfieldID VirtualNetworkConfigOperation_VIRTUAL_NETWORK_CONFIG_OPERATION_CONFIG_UPDATE_field; extern jfieldID VirtualNetworkConfigOperation_VIRTUAL_NETWORK_CONFIG_OPERATION_DESTROY_field; extern jfieldID VirtualNetworkConfigOperation_VIRTUAL_NETWORK_CONFIG_OPERATION_DOWN_field; diff --git a/java/jni/ZT_jniutils.cpp b/java/jni/ZT_jniutils.cpp index 5544446b7..bda1014fc 100644 --- a/java/jni/ZT_jniutils.cpp +++ b/java/jni/ZT_jniutils.cpp @@ -32,48 +32,12 @@ jobject createResultObject(JNIEnv *env, ZT_ResultCode code) { - jobject resultObject = NULL; - - jfieldID field; - switch(code) - { - case ZT_RESULT_OK: - case ZT_RESULT_OK_IGNORED: - LOGV("ZT_RESULT_OK"); - field = ResultCode_RESULT_OK_field; - break; - case ZT_RESULT_FATAL_ERROR_OUT_OF_MEMORY: - LOGV("ZT_RESULT_FATAL_ERROR_OUT_OF_MEMORY"); - field = ResultCode_RESULT_FATAL_ERROR_OUT_OF_MEMORY_field; - break; - case ZT_RESULT_FATAL_ERROR_DATA_STORE_FAILED: - LOGV("ZT_RESULT_FATAL_ERROR_DATA_STORE_FAILED"); - field = ResultCode_RESULT_FATAL_ERROR_DATA_STORE_FAILED_field; - break; - case ZT_RESULT_ERROR_NETWORK_NOT_FOUND: - LOGV("ZT_RESULT_ERROR_NETWORK_NOT_FOUND"); - field = ResultCode_RESULT_ERROR_NETWORK_NOT_FOUND_field; - break; - case ZT_RESULT_ERROR_UNSUPPORTED_OPERATION: - LOGV("ZT_RESULT_ERROR_UNSUPPORTED_OPERATION"); - field = ResultCode_RESULT_ERROR_UNSUPPORTED_OPERATION_field; - break; - case ZT_RESULT_ERROR_BAD_PARAMETER: - LOGV("ZT_RESULT_ERROR_BAD_PARAMETER"); - field = ResultCode_RESULT_ERROR_BAD_PARAMETER_field; - break; - case ZT_RESULT_FATAL_ERROR_INTERNAL: - default: - LOGV("ZT_RESULT_FATAL_ERROR_INTERNAL"); - field = ResultCode_RESULT_FATAL_ERROR_INTERNAL_field; - break; + jobject resultObject = env->CallStaticObjectMethod(ResultCode_class, ResultCode_fromInt_method, code); + if(env->ExceptionCheck() || resultObject == NULL) { + LOGE("Error creating ResultCode object"); + return NULL; } - resultObject = env->GetStaticObjectField(ResultCode_class, field); - if(env->ExceptionCheck() || resultObject == NULL) - { - LOGE("Error on GetStaticObjectField"); - } return resultObject; } diff --git a/java/jni/com_zerotierone_sdk_Node.cpp b/java/jni/com_zerotierone_sdk_Node.cpp index c70d121ad..92cc896ac 100644 --- a/java/jni/com_zerotierone_sdk_Node.cpp +++ b/java/jni/com_zerotierone_sdk_Node.cpp @@ -656,6 +656,10 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_node_1init( { LOGE("Error creating Node: %d", rc); resultObject = createResultObject(env, rc); + if (env->ExceptionCheck() || resultObject == NULL) { + return NULL; + } + if(node) { ZT_Node_delete(node); diff --git a/java/src/com/zerotier/sdk/ResultCode.java b/java/src/com/zerotier/sdk/ResultCode.java index 7c80e5844..21a7fae48 100644 --- a/java/src/com/zerotier/sdk/ResultCode.java +++ b/java/src/com/zerotier/sdk/ResultCode.java @@ -34,6 +34,8 @@ package com.zerotier.sdk; * occurs, the node should be considered to not be working correctly. These * indicate serious problems like an inaccessible data store or a compile * problem.

+ * + * Defined in ZeroTierOne.h as ZT_ResultCode */ public enum ResultCode { @@ -69,10 +71,32 @@ public enum ResultCode { RESULT_ERROR_BAD_PARAMETER(1002); - - private final int id; - ResultCode(int id) { this.id = id; } - public int getValue() { return id; } + private final int id; + + ResultCode(int id) { + this.id = id; + } + + public static ResultCode fromInt(int id) { + switch (id) { + case 0: + return RESULT_OK; + case 100: + return RESULT_FATAL_ERROR_OUT_OF_MEMORY; + case 101: + return RESULT_FATAL_ERROR_DATA_STORE_FAILED; + case 102: + return RESULT_FATAL_ERROR_INTERNAL; + case 1000: + return RESULT_ERROR_NETWORK_NOT_FOUND; + case 1001: + return RESULT_ERROR_UNSUPPORTED_OPERATION; + case 1002: + return RESULT_ERROR_BAD_PARAMETER; + default: + throw new RuntimeException("Unhandled value: " + id); + } + } public boolean isFatal(int id) { return (id > 100 && id < 1000);