我在这个问题上挣扎了几天,但还没有得到正确的答案。
这里是问题描述:我写了一个普通的Java程序(Program-A),写了一个基于Windows的原生代理(*.dll,用C/C++编写),使用Agent_OnLoad、Agent_OnAttach、Agent_OnUnload方法,如果使用它可以正常工作Java 命令行标志 (-agentlib)。然后我编写了另一个 Java 程序,将本机代理附加到运行 Java Program-A 上(请参阅下面的 VM attach 和 loadAgentPath 代码段),但是我得到了异常:
com.sun.tools.attach.AgentLoadException: Failed to load agent library
我试图以这种或那种方式更改agentPath(绝对或相对文件路径),但这些都不起作用。我是否应该尝试其他方法来完成这项工作。我需要将本机代理附加到正在运行的 java 程序上,而不是使用命令行标志。
有谁知道根本原因或解决方案的线索?
顺便说一句,运行附加 VM Java 代码的命令行为:
java -Djava.library.path=D:\DevTools\Java7\jre7\bin -classpath .;./tools.jar com.xxx.TestAgentVMAttacher
...
VirtualMachine virtualMachine = com.sun.tools.attach.VirtualMachine.attach(pid); // Note: this code line is executed normally, I am sure the pid is correct
...
agentPath = theFilePath + "/myagent.dll"; // Note: I am sure the dll file path is correct
virtualMachine.loadAgentPath(agentPath,null); // Note: this code line would cause the exception (AgentLoadException) as I mentioned above, no matter how I set the agentPath, even I set it as null, same exception happened.
环境相关信息:
- 操作系统:Windows XP - Java 版本:Java(TM) SE 运行时环境(内部版本 1.7.0-b147)