我在这里全亏了。我正在尝试运行JVMTI代理库,但由于某些原因它一直崩溃。
我将其范围缩小了:
(*jvm)->GetEnv(jvm, (void**)jvmti, JVMTI_VERSION_1_0);
这是代理库(在C中)的完整代码:
#include <jvmti.h>
#include <stdlib.h>
jvmtiEnv* jvmti = NULL;
JNIEXPORT jint JNICALL Agent_OnLoad(JavaVM *jvm, char *options, void *reserved)
{
printf("Agent started.\n");
_flushall();
jint err = (*jvm)->GetEnv(jvm, (void**)jvmti, JVMTI_VERSION_1_0);
if (err != JNI_OK)
{
printf("Failed to get JVMTI env!\n");
_flushall();
return err;
}
return JNI_OK;
}
JNIEXPORT jint JNICALL Agent_OnAttach(JavaVM* vm, char* options, void* reserved)
{
return JNI_OK;
}
JNIEXPORT void JNICALL Agent_OnUnload(JavaVM *vm)
{
}
当我试图找出问题所在时,我编写了一个非常简单的Java应用进行测试
这与:
public class Test
{
public static void main(String[] args)
{
System.out.println("Hello from java!");
}
}
如果我是通过netbeans将VM arg
-agentpath
设置为包含以上代码的.dll
来运行的,则该应用程序在尝试调用GetEnv()
时似乎崩溃了。我已经确保以下几点:
-JVM和
dll
均为64bit
。-绝对可以找到并加载该库(崩溃前可以看到
printf
输出。)我不知道还有什么可能导致此问题,我是否必须链接到一些我不知道的JVMTI API库?
还是这可能是我的PC上的Java安装出现问题?
谢谢
最佳答案
您应该将jvmti
的地址传递给GetEnv()
,如下所示:jint err = (*jvm)->GetEnv(jvm, (void**) &jvmti, JVMTI_VERSION_1_0);