2017-03-09 128 views
0

我有问题:findClass的返回与我的findClass调用,它返回空空

JData::JIgZorroBridgeClass = env->FindClass(JData::IgZorroBridgePath); 

大多数的答案,我觉得这个点缺失的软件包名,或类加载器的问题。

IgZorroBridgePath这里是我的类与完全合格的包名称,即。 COM/igz /佐罗。 也正如你所看到的,我在这个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(); 
} 
+1

你的问题意味着'FindClass(JData :: ExcPath)'正在工作。什么是'ExcPath'?它所指的类是否与'ZorroBridge'位于同一个罐子中? – Michael

回答

1

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