小弟最近在研究JVMTI。现在碰到这么个问题……希望各位达人指教。在我的JVMTI agent中,我利用VM_INIT事件的callback函数初始化如下两个已经在头文件中声明的变量:
runtime_permission = (*env)->FindClass(env, "java/lang/RuntimePermission"); runtime_permission_ctor = (*env)->GetMethodID(env, runtime_permission, "<init>", Ljava/lang/String;)V");然后在java主程序的另一个native函数中,利用以上的两个变量,调用NewObject方法实例化如下变量:jobject runtime_permission_inst = (*env)->NewObject(env, runtime_permission, runtime_permission_ctor, j_lib_name);
但是在调用NewObject方法时导致了JVM崩溃。经过检查,native code抛出了如下异常:
java.lang.InstantiationException: java.nio.charset.Charset看起来程序试图实例化java.nio.charset.Charset这个抽象类,因此抛出了异常。这是我比较困惑的地方,因为并没有任何一条语句试图调用Charset的构造函数。所以我想到,是不是在JVMTI中初始化的变量,不能在其他的native函数中使用呢?求教各位……

解决方案 »

  1.   

    这个…………没有回复吗?小弟初来CSDN,是不是提问格式有问题……望各位前辈不吝指教!
      

  2.   

    会不会是类还未正确加载,或类加载器的问题。Java 中使用一个类,会事先连加载解析一并完成,也就是 static { } 也会在解析时执行。如果它用到其它类也会传播这个变化。不知道 C++ 里面这样调用一个方法,这些过程是自动完成的还是手工完成的。用 C++ 加载一个怎么请求加载后一并解析它?
      

  3.   


    应该不是这个的问题,因为如果将实例化的语句同样放在JVMTI中,便没有这个错误………………