我在HKEY_CLASSES_ROOT*中创建了一个C:\test.exe注册表项,其值为:"C:\test.exe“"%1”,以创建一个新的右键上下文菜单项,该菜单项将单击文件的文件路径传递给已注册的test.exe。在test.exe内部加载一个dll文件,该文件应该注入到已经运行的jvm中,以调用方法并传递文件路径。问题是,.dll没有找到JVM实例,尽管它运行在一个while-循环(原型)中。你能帮我解决那个问题吗?如何访问JVM?谢谢
.java:
public class Main
{
public static void main(String[] args)
{
while(true)
{
}
}
public static void readAndOutputFilePath(String result)
{
System.out.println("Java result: "+result);
try
{
System.in.read();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}.dll:
HMODULE m_hDllInstance = LoadLibrary("jvm.dll");
if( m_hDllInstance == 0)
{
printf("The jvm.dll could not be found");
getchar();
}
else
printf("jvm.dll found");
JavaVM *jvm;
JNIEnv *env;
typedef jint (JNICALL * GetCreatedJavaVMs)(JavaVM**, jsize, jsize*);
GetCreatedJavaVMs jni_GetCreatedJavaVMs = (GetCreatedJavaVMs)GetProcAddress(m_hDllInstance, "JNI_GetCreatedJavaVMs");
jint size = 1;
jint vmCount;
jint ret= jni_GetCreatedJavaVMs(&jvm, size, &vmCount);
cout << endl << "GetCreated: " << vmCount << endl;
getchar();
jint rc = jvm->AttachCurrentThread((void **) & env, NULL);
jclass cls = env->FindClass("Main");
jmethodID mid = env->GetStaticMethodID(cls, "readAndOutputFilePath", "(Ljava/lang/String;)V");
jstring resultString = env->NewStringUTF(path);
env->CallStaticVoidMethod(cls, mid, resultString);
...发布于 2014-04-16 12:10:23
与运行在独立、独立进程中的Java程序通信没有什么特别之处。Java支持的任何IPC工具都可以使用。首先想到的是本地套接字,但也包括共享内存和普通的旧文件系统。
JNI可能无关紧要,因为您的Java程序处于一个单独的进程中--除非您希望使用一些特定于windows的通信模式,如OLE。在这种情况下,您需要用另一种语言编写通信协议,并将它们加载到Java程序中。
发布于 2014-04-14 08:04:58
您似乎不明白JVM实际上是什么。它本身就是加载到进程中的DLL。这不是一件“事情”,只是“在那里”。使用JNI调用API,您可以启动一个JNI调用API,除非您这样做,否则您不会在您自己启动的.exe中找到‘JVM’。
https://stackoverflow.com/questions/23044993
复制相似问题