C++ FindClass返回null
我的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
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中?