hprof_util.c

来自「一个小公司要求给写的很简单的任务管理系统。」· C语言 代码 · 共 1,736 行 · 第 1/4 页

C
1,736
字号
    super_klass = JNI_FUNC_PTR(env,GetSuperclass)(env, klass);    return super_klass;}jmethodIDgetStaticMethodID(JNIEnv *env, jclass clazz, const char *name, const char *sig){    jmethodID method;        HPROF_ASSERT(env!=NULL);    HPROF_ASSERT(clazz!=NULL);    HPROF_ASSERT(name!=NULL);    HPROF_ASSERT(sig!=NULL);    CHECK_EXCEPTIONS(env) {        method = JNI_FUNC_PTR(env,GetStaticMethodID)(env, clazz, name, sig);    } END_CHECK_EXCEPTIONS;    HPROF_ASSERT(method!=NULL);    return method;}jmethodIDgetMethodID(JNIEnv *env, jclass clazz, const char *name, const char *sig){    jmethodID method;    jobject exception;        HPROF_ASSERT(env!=NULL);    HPROF_ASSERT(clazz!=NULL);    HPROF_ASSERT(name!=NULL);    HPROF_ASSERT(sig!=NULL);    method = JNI_FUNC_PTR(env,GetMethodID)(env, clazz, name, sig);    /* Might be a static method */    exception = JNI_FUNC_PTR(env,ExceptionOccurred)(env);    if ( exception != NULL ) {        JNI_FUNC_PTR(env,ExceptionClear)(env);        method = getStaticMethodID(env, clazz, name, sig);    }    HPROF_ASSERT(method!=NULL);    return method;}jclassfindClass(JNIEnv *env, const char *name)/* WARNING: Must be called inside WITH_LOCAL_REFS */{    jclass clazz;        HPROF_ASSERT(env!=NULL);    HPROF_ASSERT(name!=NULL);    LOG2("FindClass", name);    CHECK_EXCEPTIONS(env) {        clazz = JNI_FUNC_PTR(env,FindClass)(env, name);    } END_CHECK_EXCEPTIONS;    HPROF_ASSERT(clazz!=NULL);    return clazz;}jfieldIDgetStaticFieldID(JNIEnv *env, jclass clazz, const char *name, const char *sig){    jfieldID field;        HPROF_ASSERT(env!=NULL);    HPROF_ASSERT(clazz!=NULL);    HPROF_ASSERT(name!=NULL);    HPROF_ASSERT(sig!=NULL);    CHECK_EXCEPTIONS(env) {        field = JNI_FUNC_PTR(env,GetStaticFieldID)(env, clazz, name, sig);    } END_CHECK_EXCEPTIONS;    return field;}voidsetStaticIntField(JNIEnv *env, jclass clazz, jfieldID field, jint value){    HPROF_ASSERT(env!=NULL);    HPROF_ASSERT(clazz!=NULL);    HPROF_ASSERT(field!=NULL);    CHECK_EXCEPTIONS(env) {        JNI_FUNC_PTR(env,SetStaticIntField)(env, clazz, field, value);    } END_CHECK_EXCEPTIONS;}static jobjectcallStaticObjectMethod(JNIEnv *env, jclass klass, jmethodID method){    jobject x;        HPROF_ASSERT(env!=NULL);    HPROF_ASSERT(klass!=NULL);    HPROF_ASSERT(method!=NULL);    CHECK_EXCEPTIONS(env) {        x = JNI_FUNC_PTR(env,CallStaticObjectMethod)(env, klass, method);    } END_CHECK_EXCEPTIONS;    return x;}static jlongcallLongMethod(JNIEnv *env, jobject object, jmethodID method){    jlong x;        HPROF_ASSERT(env!=NULL);    HPROF_ASSERT(object!=NULL);    HPROF_ASSERT(method!=NULL);    CHECK_EXCEPTIONS(env) {        x = JNI_FUNC_PTR(env,CallLongMethod)(env, object, method);    } END_CHECK_EXCEPTIONS;    return x;}static voidcallVoidMethod(JNIEnv *env, jobject object, jmethodID method, jboolean arg){    HPROF_ASSERT(env!=NULL);    HPROF_ASSERT(object!=NULL);    HPROF_ASSERT(method!=NULL);    CHECK_EXCEPTIONS(env) {        JNI_FUNC_PTR(env,CallVoidMethod)(env, object, method, arg);    } END_CHECK_EXCEPTIONS;}static jstringnewStringUTF(JNIEnv *env, const char *name)/* WARNING: Must be called inside WITH_LOCAL_REFS */{    jstring string;        HPROF_ASSERT(env!=NULL);    HPROF_ASSERT(name!=NULL);    CHECK_EXCEPTIONS(env) {        string = JNI_FUNC_PTR(env,NewStringUTF)(env, name);    } END_CHECK_EXCEPTIONS;    HPROF_ASSERT(string!=NULL);    return string;}static jobjectnewThreadObject(JNIEnv *env, jclass clazz, jmethodID method,                 jthreadGroup group, jstring name)/* WARNING: Must be called inside WITH_LOCAL_REFS */{    jthread thread;        HPROF_ASSERT(env!=NULL);    HPROF_ASSERT(clazz!=NULL);    HPROF_ASSERT(method!=NULL);    CHECK_EXCEPTIONS(env) {        thread = JNI_FUNC_PTR(env,NewObject)(env, clazz, method, group, name);    } END_CHECK_EXCEPTIONS;    HPROF_ASSERT(thread!=NULL);    return thread;}jbooleanisSameObject(JNIEnv *env, jobject o1, jobject o2){    HPROF_ASSERT(env!=NULL);    if ( o1 == o2  || JNI_FUNC_PTR(env,IsSameObject)(env, o1, o2) ) {        return JNI_TRUE;    }    return JNI_FALSE;}void pushLocalFrame(JNIEnv *env, jint capacity){    HPROF_ASSERT(env!=NULL);    CHECK_EXCEPTIONS(env) {        jint ret;                ret = JNI_FUNC_PTR(env,PushLocalFrame)(env, capacity);        if ( ret != 0 ) {            HPROF_ERROR(JNI_TRUE, "JNI PushLocalFrame returned non-zero");        }    } END_CHECK_EXCEPTIONS;}void popLocalFrame(JNIEnv *env, jobject result){    jobject ret;        HPROF_ASSERT(env!=NULL);    ret = JNI_FUNC_PTR(env,PopLocalFrame)(env, result);    if ( (result != NULL && ret == NULL) || (result == NULL && ret != NULL) ) {        HPROF_ERROR(JNI_TRUE, "JNI PopLocalFrame returned wrong object");    }}voidregisterNatives(JNIEnv *env, jclass clazz,                         JNINativeMethod *methods, jint count){    jint ret;        HPROF_ASSERT(env!=NULL);    HPROF_ASSERT(clazz!=NULL);    HPROF_ASSERT(methods!=NULL);    HPROF_ASSERT(count>0);    ret = JNI_FUNC_PTR(env,RegisterNatives)(env, clazz, methods, count);    if ( ret != 0 ) {        HPROF_ERROR(JNI_TRUE, "JNI RegisterNatives returned non-zero");    }}/* ---------------------------------------------------------------------- *//* JVMTI Support Functions */char *getErrorName(jvmtiError error_number){    char *error_name;        error_name = NULL;    (void)JVMTI_FUNC_PTR(gdata->jvmti,GetErrorName)                        (gdata->jvmti, error_number, &error_name);    return error_name;}jvmtiPhasegetPhase(void){    jvmtiPhase phase;        phase = 0;    (void)JVMTI_FUNC_PTR(gdata->jvmti,GetPhase)(gdata->jvmti, &phase);    return phase;}char *phaseString(jvmtiPhase phase){    switch ( phase ) {        case JVMTI_PHASE_ONLOAD:            return "onload";        case JVMTI_PHASE_PRIMORDIAL:            return "primordial";        case JVMTI_PHASE_START:            return "start";        case JVMTI_PHASE_LIVE:            return "live";        case JVMTI_PHASE_DEAD:            return "dead";    }    return "unknown";}voiddisposeEnvironment(void){    (void)JVMTI_FUNC_PTR(gdata->jvmti,DisposeEnvironment)                        (gdata->jvmti);}jlonggetObjectSize(jobject object){    jlong size;    jvmtiError error;        HPROF_ASSERT(object!=NULL);    size = 0;    error = JVMTI_FUNC_PTR(gdata->jvmti,GetObjectSize)                        (gdata->jvmti, object, &size);    if ( error != JVMTI_ERROR_NONE ) {        HPROF_JVMTI_ERROR(error, "Cannot get object size");    }    return size;}static jboolean isInterface(jclass klass){    jvmtiError error;    jboolean   answer;        HPROF_ASSERT(klass!=NULL);    answer = JNI_FALSE;    error = JVMTI_FUNC_PTR(gdata->jvmti,IsInterface)                        (gdata->jvmti, klass, &answer);    if ( error != JVMTI_ERROR_NONE ) {        HPROF_JVMTI_ERROR(error, "Cannot call IsInterface");    }    return answer;}jintgetClassStatus(jclass klass){    jvmtiError error;    jint       status;        HPROF_ASSERT(klass!=NULL);    status = 0;    error = JVMTI_FUNC_PTR(gdata->jvmti,GetClassStatus)                        (gdata->jvmti, klass, &status);    if ( error == JVMTI_ERROR_WRONG_PHASE ) {        /* Treat this as ok */        error = JVMTI_ERROR_NONE;        status = 0;    }    if ( error != JVMTI_ERROR_NONE ) {        HPROF_JVMTI_ERROR(error, "Cannot get class status");    }    return status;}jobjectgetClassLoader(jclass klass)/* WARNING: Must be called inside WITH_LOCAL_REFS */{    jvmtiError error;    jobject    loader;        HPROF_ASSERT(klass!=NULL);    loader = NULL;    error = JVMTI_FUNC_PTR(gdata->jvmti,GetClassLoader)                        (gdata->jvmti, klass, &loader);    if ( error != JVMTI_ERROR_NONE ) {        HPROF_JVMTI_ERROR(error, "Cannot get class loader");    }    return loader;}jlonggetTag(jobject object){    jlong tag;    jvmtiError error;        HPROF_ASSERT(object!=NULL);    tag = 0;    error = JVMTI_FUNC_PTR(gdata->jvmti,GetTag)                        (gdata->jvmti, object, &tag);    if ( error != JVMTI_ERROR_NONE ) {        HPROF_JVMTI_ERROR(error, "Cannot get object tag");    }    return tag;}voidsetTag(jobject object, jlong tag){    jvmtiError error;        HPROF_ASSERT(object!=NULL);    error = JVMTI_FUNC_PTR(gdata->jvmti,SetTag)                        (gdata->jvmti, object, tag);    if ( error != JVMTI_ERROR_NONE ) {        HPROF_JVMTI_ERROR(error, "Cannot set object tag");    }}void      getObjectMonitorUsage(jobject object, jvmtiMonitorUsage *uinfo){    jvmtiError error;        HPROF_ASSERT(object!=NULL);    error = JVMTI_FUNC_PTR(gdata->jvmti,GetObjectMonitorUsage)                        (gdata->jvmti, object, uinfo);    if ( error != JVMTI_ERROR_NONE ) {        HPROF_JVMTI_ERROR(error, "Cannot get monitor usage info");    }}voidgetOwnedMonitorInfo(jthread thread, jobject **ppobjects, jint *pcount)/* WARNING: Must be called inside WITH_LOCAL_REFS */{    jvmtiError error;       HPROF_ASSERT(thread!=NULL);    HPROF_ASSERT(ppobjects!=NULL);    HPROF_ASSERT(pcount!=NULL);    *pcount = 0;    *ppobjects = NULL;    error = JVMTI_FUNC_PTR(gdata->jvmti,GetOwnedMonitorInfo)                        (gdata->jvmti, thread, pcount, ppobjects);    if ( error == JVMTI_ERROR_THREAD_NOT_ALIVE ) {        *pcount = 0;        error = JVMTI_ERROR_NONE;    }    if ( error != JVMTI_ERROR_NONE ) {        HPROF_JVMTI_ERROR(error, "Cannot get thread owned monitor info");    }}void      getSystemProperty(const char *name, char **value){    jvmtiError error;        HPROF_ASSERT(name!=NULL);    *value = NULL;    error = JVMTI_FUNC_PTR(gdata->jvmti,GetSystemProperty)                        (gdata->jvmti, name, value);    if ( error != JVMTI_ERROR_NONE ) {        HPROF_JVMTI_ERROR(error, "Cannot get system property");    }}void getClassSignature(jclass klass, char** psignature, char **pgeneric_signature){    jvmtiError error;    char *generic_signature;        HPROF_ASSERT(klass!=NULL);    *psignature = NULL;    error = JVMTI_FUNC_PTR(gdata->jvmti,GetClassSignature)                        (gdata->jvmti, klass, psignature, &generic_signature);    if ( error != JVMTI_ERROR_NONE ) {        HPROF_JVMTI_ERROR(error, "Cannot get class signature");    }    if ( pgeneric_signature != NULL ) {        *pgeneric_signature = generic_signature;    } else {        jvmtiDeallocate(generic_signature);    }}void getSourceFileName(jclass klass, char** pname){    jvmtiError error;        HPROF_ASSERT(klass!=NULL);    *pname = NULL;    error = JVMTI_FUNC_PTR(gdata->jvmti,GetSourceFileName)                        (gdata->jvmti, klass, pname);    if ( error == JVMTI_ERROR_ABSENT_INFORMATION ) {        error = JVMTI_ERROR_NONE;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?