C++ FindClass返回null

C++ FindClass返回null,c++,java-native-interface,C++,Java Native Interface,我的FindClass调用返回null时遇到问题: JData::JIgZorroBridgeClass = env->FindClass(JData::IgZorroBridgePath); 关于这一点,我找到的大多数答案都指向缺少包名或类加载器问题 IgZorroBridgePath这里是我的类,具有完全限定的包名,即.com/igz/Zorro。 正如您所看到的,在调用FindClass之前,我正在初始化JVM,因此我认为我应该已经在正确的线程上了 还有什么我可以查的吗 #incl

我的FindClass调用返回null时遇到问题:

JData::JIgZorroBridgeClass = env->FindClass(JData::IgZorroBridgePath);
关于这一点,我找到的大多数答案都指向缺少包名或类加载器问题

IgZorroBridgePath这里是我的类,具有完全限定的包名,即.com/igz/Zorro。 正如您所看到的,在调用FindClass之前,我正在初始化JVM,因此我认为我应该已经在正确的线程上了

还有什么我可以查的吗

#include <assert.h>
#include "JNIHandler.hpp"
#include "JReferences.hpp"

const char* JVMClassPathOption =  "-Djava.class.path=Plugin/ig/igplugin-0.1.jar";
const char* IgZorroBridgePath = "com/danlind/igz/ZorroBridge";


void JNIHandler::init()
{
    initializeJVM();
    initializeJavaReferences();
}

void JNIHandler::initializeJVM()
{
    if(isJVMLoaded) return;

    JavaVMInitArgs args;
    JavaVMOption options[1];

    args.version = JData::JNI_VERSION;
    args.nOptions = 1;
    args.options = options;
    options[0].optionString = (char*)JData::JVMClassPathOption;
    args.ignoreUnrecognized = JNI_FALSE;

    jint res = JNI_CreateJavaVM(&jvm, (void **)&env, &args);
    assert(res ==  JNI_OK);
    isJVMLoaded = true;
}

JNIEnv* JNIHandler::getJNIEnvironment(){
    return env;
}

JNIEnv* JNIHandler::getEnvForCurrentThread()
{
    int envStat = jvm->GetEnv((void **)&env, JData::JNI_VERSION);
    if (envStat == JNI_EDETACHED) {
        jint res = jvm->AttachCurrentThread((void**)&env, NULL);
        assert (res == JNI_OK);
    }
    return env;
}


void JNIHandler::initializeJavaReferences()
{
    if(areJavaReferencesInitialized) return;

    initExceptionHandling();
    initBridgeObject();
    registerNatives();

    areJavaReferencesInitialized = true;
}

void JNIHandler::initBridgeObject()
{
    JData::JIgZorroBridgeClass = env->FindClass(JData::IgZorroBridgePath);
    checkJNIExcpetion(env);
    registerClassMethods();
    JData::JIgZorroBridgeObject = env->NewObject(JData::JIgZorroBridgeClass, JData::constructor.methodID);
    checkJNIExcpetion(env);
}

void JNIHandler::initExceptionHandling()
{
    JData::ExceptionClass = env->FindClass(JData::ExcPath);
    JData::excGetName.methodID = env->GetMethodID(JData::ExceptionClass, JData::excGetName.name, JData::excGetName.signature);
}

void JNIHandler::registerNatives()
{
    JData::JZorroClass = env->FindClass(JData::ZorroPath);
    env->RegisterNatives(JData::JZorroClass, JData::nativesTable, JData::nativesTableSize);
    checkJNIExcpetion(env);
}

void JNIHandler::registerClassMethods()
{
    for(auto *desc : JData::igZorroBridgeMethods)
    {
        desc->methodID = env->GetMethodID(JData::JIgZorroBridgeClass, desc->name, desc->signature);
        checkJNIExcpetion(env);
    }
}

void JNIHandler::checkJNIExcpetion(JNIEnv* env)
{
    jthrowable exc = env->ExceptionOccurred();
    if (!exc) return;

    jclass exccls(env->GetObjectClass(exc));
    jstring name = static_cast<jstring>(env->CallObjectMethod(exccls, JData::excGetName.methodID));
    char const* utfName(env->GetStringUTFChars(name, 0));

    JData::excGetMessage.methodID = env->GetMethodID(exccls, JData::excGetMessage.name, JData::excGetMessage.signature);
    jstring message = static_cast<jstring>(env->CallObjectMethod(exc, JData::excGetMessage.methodID));
    char const* utfMessage(env->GetStringUTFChars(message, 0));

    BrokerError(utfName);
    BrokerError(utfMessage);

    env->ReleaseStringUTFChars(message, utfMessage);
    env->ReleaseStringUTFChars(name, utfName);
    env->ExceptionClear();
}
#包括
#包括“JNIHandler.hpp”
#包括“JReferences.hpp”
const char*JVMClassPathOption=“-Djava.class.path=Plugin/ig/igplugin-0.1.jar”;
const char*IgZorroBridgePath=“com/danlind/igz/ZorroBridge”;
void JNIHandler::init()
{
初始化jvm();
初始化ejavarreferences();
}
void JNIHandler::initializeJVM()
{
if(isJVMLoaded)返回;
JavaVMInitArgs args;
JavaVMOption选项[1];
args.version=JData::JNI\u version;
args.nOptions=1;
args.options=选项;
选项[0]。选项字符串=(char*)JData::JVMClassphoption;
args.ignoreunrecogned=JNI_FALSE;
jint res=JNI_CreateJavaVM(&jvm,(void**)&env和args);
断言(res==JNI_OK);
isJVMLoaded=true;
}
JNIEnv*JNIHandler::getJNIEnvironment(){
返回环境;
}
JNIEnv*JNIHandler::getEnvForCurrentThread()
{
int-envStat=jvm->GetEnv((void**)和env,JData::JNI\u版本);
if(envStat==JNI_e附加){
jint res=jvm->AttachCurrentThread((void**)和env,NULL);
断言(res==JNI_OK);
}
返回环境;
}
void JNIHandler::initializeJavaReferences()
{
if(areJavaReferencesInitialized)返回;
initExceptionHandling();
initBridgeObject();
注册表项();
areJavaReferencesInitialized=true;
}
void JNIHandler::initBridgeObject()
{
JData::JIgZorroBridgeClass=env->FindClass(JData::IgZorroBridgePath);
检查JNIEXCPTION(环境);
registerClassMethods();
JData::JIgZorroBridgeObject=env->NewObject(JData::JIgZorroBridgeClass,JData::constructor.methodID);
检查JNIEXCPTION(环境);
}
void JNIHandler::initExceptionHandling()
{
JData::ExceptionClass=env->FindClass(JData::ExcPath);
JData::exgetname.methodID=env->GetMethodID(JData::ExceptionClass,JData::exgetname.name,JData::exgetname.signature);
}
void JNIHandler::registerNatives()
{
JData::JZorroClass=env->FindClass(JData::ZorroPath);
env->RegisterNatives(JData::JZorroClass、JData::nativesTable、JData::nativesTableSize);
检查JNIEXCPTION(环境);
}
void JNIHandler::registerClassMethods()
{
用于(自动*desc:JData::igZorroBridgeMethods)
{
desc->methodID=env->GetMethodID(JData::JIgZorroBridgeClass,desc->name,desc->signature);
检查JNIEXCPTION(环境);
}
}
void JNIHandler::checkjniexcation(JNIEnv*env)
{
jthrowable exc=env->ExceptionOccurred();
如果(!exc)返回;
jclass exccls(env->GetObjectClass(exc));
jstring name=static_cast(env->CallObjectMethod(exccls,JData::exgetname.methodID));
char const*utfName(env->GetStringUTFChars(名称,0));
JData::exgetmessage.methodID=env->GetMethodID(exccls,JData::exgetmessage.name,JData::exgetmessage.signature);
jstring message=static_cast(env->CallObjectMethod(exc,JData::exgetmessage.methodID));
字符常量*utfMessage(env->GetStringUTFChars(消息,0));
经纪人经纪人(utfName);
BrokerError(utfMessage);
env->ReleaseStringUTFChars(消息,utfMessage);
env->ReleaseStringUTFChars(名称,utfName);
环境->例外清除();
}

我使用的是spring boot maven插件,它重新调整了包结构。我转而使用shade插件,它不会移动软件包。这使FindClass能够找到我的java类。

您的问题意味着
FindClass(JData::ExcPath)
正在工作。什么是
ExcPath
?它所引用的类是否与ZorroBridge位于同一个jar中?