我正在使用JNI来分析一些程序。我只是想知道,在获取JCLASS Reference之后,如何找到底层类的大小?

例如: cls= env-> findclass(“lee / boehm / test”);

从这里如何评估lee.boehm.test中的类的大小。

谢谢 Boehm

有帮助吗?

解决方案

你去了

Agent.c

#include <stdlib.h>
#include "jvmti.h"

jvmtiEnv *globalJVMTIInterface;

JNIEXPORT jlong JNICALL Java_util_Util_getObjectSize
  (JNIEnv *jni_env , jclass class , jobject object) {

    jlong objectSize;

     (*globalJVMTIInterface)->GetObjectSize(globalJVMTIInterface, object, &objectSize);

     return objectSize;
}

JNIEXPORT jint JNICALL
Agent_OnLoad(JavaVM * jvm, char *options, void *reserved)
{

  jint returnCode = (*jvm)->GetEnv(jvm, (void **) &globalJVMTIInterface,
      JVMTI_VERSION_1_0);

  if (returnCode != JNI_OK)
    {
      fprintf(stderr,
          "The version of JVMTI requested (1.0) is not supported by this JVM.\n");
      return JVMTI_ERROR_UNSUPPORTED_VERSION;
    }

  return JVMTI_ERROR_NONE;
}
.

和./util/util.java

package util;

public class Util {
    public static final native long getObjectSize(Object obj);
}
.

和test.java

public class Test {

   public static void main(String[] args) {

      System.out.println(util.Util.getObjectSize(new String()));

   }

}
.

gcc -i / opt / ibm-jdk-bin-1.6.0.9 / include -shared -fpic -o libagent.so agent.c

java -agentpath:./ libagent.so test

其他提示

hmmm ....如果你的意思是类字节的大小,那么是......你会使用JVMTI来重新转换所讨论的类,它会生成您收听的ClassLoadhook事件,这可能会给您类字节和大小....但它们会与磁盘上的.class文件相同....但是如果类是动态生成的,那么您不能只查看.class文件的大小,那么那么这种技术会起作用.....如果你愿意,我可以为你编写代码。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top