#include "logger.h"

JavaVM *gJavaVM;
const char *kringservicePath = "cx/ring/service/RingserviceJNI";

void deinitClassHelper(JNIEnv *env, jobject obj) {
	RING_INFO("deinitClassHelper");

	/* delete cached object instances */
    env->DeleteGlobalRef(obj);
	RING_INFO("deinitClassHelper: object %x deleted", obj);
}

JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) {
	JNIEnv *env;
	jclass clazz;
	jint r;

    RING_INFO("JNI_OnLoad");

	//Assume it is c++
	r = vm->GetEnv ((void **) &env, JNI_VERSION_1_6);
    if (r != JNI_OK) {
		RING_ERR("JNI_OnLoad: failed to get the environment using GetEnv()");
        return -1;
    }
	RING_INFO("JNI_Onload: GetEnv %p", env);

	clazz = env->FindClass (kringservicePath);
	if (!clazz) {
        RING_ERR("JNI_Onload: whoops, %s class not found!", kringservicePath);
	}
	gJavaVM = vm;
	RING_INFO("JNI_Onload: JavaVM %p", gJavaVM);

	/* put instances of class object we need into cache */
    //initClassHelper(env, kManagerPath, &gManagerObject);

	JNINativeMethod methods[] = {

	$defs

	};

	r = env->RegisterNatives (clazz, methods, (int) (sizeof(methods) / sizeof(methods[0])));
	return JNI_VERSION_1_6;
}

void JNI_OnUnLoad(JavaVM* vm, void* reserved) {
    JNIEnv* env;
	jclass clazz;

	RING_INFO("JNI_OnUnLoad");

	/* get env */
    if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
		RING_ERR("JNI_OnUnLoad: failed to get the environment using GetEnv()");
        return;
    }
	RING_INFO("JNI_OnUnLoad: GetEnv %p", env);

    /* Get jclass with env->FindClass */
	clazz = env->FindClass(kringservicePath);
	if (!clazz) {
        RING_ERR("JNI_OnUnLoad: whoops, %s class not found!", kringservicePath);
	}

	/* remove instances of class object we need into cache */
    //deinitClassHelper(env, gManagerObject);

	env->UnregisterNatives(clazz);
	RING_INFO("JNI_OnUnLoad: Native functions unregistered");
}
