2017-03-09 12 views
0

を返します。FindClassが、私はnullを返します私のFindClassが呼び出しに問題を抱えているヌル

IgZorroBridgePathここには、完全修飾パッケージ名を持つmyクラスがあります。 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(); 
} 
+1

あなたの質問は、 'FindClass(JData :: ExcPath)'が働いていることを意味しています。 'ExcPath'とは何ですか?それが参照しているクラスは、 'ZorroBridge'と同じ瓶にありますか? – Michael

答えて

1

私は、パッケージ構造を再シャッフルするspring boot mavenプラグインを使用していました。代わりにシェード・プラグインを使用するように切り替えました。パッケージを移動させません。これにより、FindClassは自分のJavaクラスを見つけることができました。

関連する問題