Java JNI FindClass找不到类?

Java JNI FindClass找不到类?,java,c++,java-native-interface,Java,C++,Java Native Interface,将此dll注入java程序时,程序立即停止响应。当我打开调试器时,它说我试图用env->FindClass查找的类等于0x000000000000(NULL)。我不知道为什么,因为我确定给出的路径是正确的 以下是我的测试项目主线程中的代码: #include <Windows.h> #include <jni.h> DWORD WINAPI Main_Thread(LPVOID lpParam) { HMODULE m_hDllInstance = LoadLibrar

将此dll注入java程序时,程序立即停止响应。当我打开调试器时,它说我试图用env->FindClass查找的类等于0x000000000000(NULL)。我不知道为什么,因为我确定给出的路径是正确的

以下是我的测试项目主线程中的代码:

#include <Windows.h>
#include <jni.h>

DWORD WINAPI Main_Thread(LPVOID lpParam)
{
HMODULE m_hDllInstance = LoadLibraryA("jvm.dll");
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);
jint rc = jvm->AttachCurrentThread((void **)& env, NULL);

//NULL?
jclass PlayerControllerMP = env->FindClass("net/minecraft/client/multiplayer/PlayerControllerMP"); //NULL?

jmethodID constructor = env->GetStaticMethodID(PlayerControllerMP, "<init>", "(Minecraft, NetHandlerPlayClient)PlayerControllerMP");

jobject pcmpObj = env->NewObject(PlayerControllerMP, constructor);
jmethodID getReach = env->GetMethodID(PlayerControllerMP, "getBlockReachDistance", "()F");

while (!GetAsyncKeyState(VK_END))
{
    env->CallFloatMethod(pcmpObj, getReach);
}

jvm->DetachCurrentThread();
return S_OK;
}
#包括
#包括
DWORD WINAPI主线程(LPVOID lpParam)
{
HMODULE m_hDllInstance=LoadLibraryA(“jvm.dll”);
JavaVM*jvm;
JNIEnv*env;
typedef jint(JNICALL*GetCreatedJavaVMs)(JavaVM**,jsize,jsize*);
GetCreatedJavaVMs jni_GetCreatedJavaVMs=(GetCreatedJavaVMs)GetProcAddress(m_hdlinstance,“jni_GetCreatedJavaVMs”);
jint大小=1;
金特计数;
jint ret=jni_GetCreatedJavaVMs(&jvm、size和vmCount);
jint rc=jvm->AttachCurrentThread((void**)和env,NULL);
//空的?
jclass PlayerControllerMP=env->FindClass(“net/minecraft/client/multiplayer/PlayerControllerMP”);//空?
jmethodID constructor=env->GetStaticMethodID(PlayerControllerMP,”,“(Minecraft,NetHandlerPlayClient)PlayerControllerMP”);
jobject pcmpObj=env->NewObject(PlayerControllerMP,构造函数);
jmethodID getReach=env->GetMethodID(PlayerControllerMP,“getBlockReachDistance”,即“()F”);
而(!GetAsyncKeyState(VK_END))
{
env->CallFloatMethod(pcmpObj,getReach);
}
jvm->DetachCurrentThread();
返回S_OK;
}

感谢您的帮助,如果代码看起来有点滑稽,很抱歉粘贴它有困难。

如果您从任何JNI调用中得到错误,您应该使用一个异常跟踪方法,并且您不应该让代码像没有发生一样继续。您不应该加载jvm.dll,而应该使用已经加载的实例:查看;另外,在继续之前,请确保jni_GetCreatedJavaVMs和AttachCurrentThread都成功。检查属于该Thread的类加载器。如果从任何jni调用中获得错误,则应使用异常跟踪方法之一,并且不应让代码继续运行,就好像它没有发生一样。不应加载jvm.dll,而是使用已经加载的实例:查看;另外,在继续之前,请确保jni_GetCreatedJavaVMs和AttachCurrentThread都成功