JNIEXPORT jboolean JNICALL Java_com_baidu_mdl_demo_MDL_validate(JNIEnv *env, jclass thiz) {
     std::lock_guard<std::mutex> lock(shared_mutex);
     LOGI("jni validate invoked");
     bool success = false;
     double sum = -1;
     double sign = 0;
     EXCEPTION_HEADER
         Loader *loader = Loader::shared_instance();
         if (!loader->get_loaded()) {
             throw_exception("loader is not loaded yet");
         }
         Net *net = get_net_instance(loader->_model);
         net->set_thread_num(1);
         vector<float> cpp_result = net->forward_from_to(nullptr, 0, 1, true);
         int cpp_result_count = cpp_result.size();
         if (cpp_result_count > 0) {
             sum = 0;
             for (int i = 0; i < cpp_result_count; i++) {
                 sum += cpp_result[i];
             }
         }
         sign = loader->_model["meta"]["first_layer_sign"].number_value();
         if (abs(sum - sign) < 0.5) {
             success = true;
         }
     EXCEPTION_FOOTER
     LOGI("jni validate returned: %s, calculated sign: %lf, expected sign: %lf", (success ? "true" : "false"), sum, sign);
     return success ? JNI_TRUE : JNI_FALSE;
 }
    JNIEXPORT void JNICALL Java_com_baidu_mdl_demo_MDL_setThreadNum(
        JNIEnv *env, jclass thiz, jint num) {
         EXCEPTION_HEADER
          Loader *loader = Loader::shared_instance();
            if (!loader->get_loaded()) {
                throw_exception("loader is not loaded yet");
            }
           Net *net = get_net_instance(loader->_model);
           net->set_thread_num(num);
           if (num > Gemmer::gemmers.size()) {
             for (int i = 0; i < num - Gemmer::gemmers.size(); i++) {
                    Gemmer::gemmers.push_back(new mdl::Gemmer());
                }

           }
          EXCEPTION_FOOTER
        }