Неопределенная ссылка на JNI_CreateJavaVM Eclipse и Linux

Я использую Ubuntu 10.04 с Omnet++ 4.0p1 и JSimpleModule (который использует SWIG для создания оболочек Java для методов C++, найденных в Omnet++). Я пытаюсь создать симуляцию на Java, используя две вышеуказанные библиотеки, и когда я пытаюсь создать проект, я получаю «Неопределенная ссылка на JNI_CreateJavaVM» как ошибку в JUtil.cc (код, предоставленный JSimpleModule). Я огляделся, включив все нужные библиотеки, и все равно ничего не исправил. В Omnet++ IDE (Eclipse) я включаю:

/usr/lib/jvm/java-6-openjdk/include
/usr/lib/jvm/java-6-openjdk/include/linux
/usr/lib/jvm/java-6-openjdk/jre/lib/i386/client

и связываю:

/usr/lib/jvm/java-6-openjdk/jre/lib
/usr/lib/jvm/java-6-openjdk/jre/lib/client
-ljvm

Я также попытался скомпилировать из терминала, используя opp_makemake (который создает Makefile) со следующими параметрами:

-I/usr/lib/jvm/java-6-openjdk/include
-I/usr/lib/jvm/java-6-openjdk/include/linux
-I/usr/lib/jvm/java-6-openjdk/jre/lib/i386/client
-L/usr/lib/jvm/java-6-openjdk/jre/lib
-L/usr/lib/jvm/java-6-openjdk/jre/lib/client -ljvm

Вот начало JUtil.cc до ошибки (примечание: jni.h включен в JUtil.h):

#include "JUtil.h"
#include "JSimpleModule.h"

//#define DEBUGPRINTF printf
#define DEBUGPRINTF (void)

#ifdef _WIN32
#define PATH_SEP ";"
#else
#define PATH_SEP ":"
#endif

// This will come from the generated SimkernelJNI_registerNatives.cc
void SimkernelJNI_registerNatives(JNIEnv *jenv);

JavaVM *JUtil::vm;
JNIEnv *JUtil::jenv;


void JUtil::initJVM()
{
    DEBUGPRINTF("Starting JVM...\n");
    JavaVMInitArgs vm_args;
    JavaVMOption options[10];

    int n = 0;
    const char *classpath = getenv("CLASSPATH");
    if (!classpath)
        opp_error("CLASSPATH environment variable is not set");
    // FIXME remove hack once IDE builds the classpath corretcly
    const char *classpath2 = getenv("CLASSPATH2");
    std::string classpathOption = std::string("-Djava.class.path=")+(classpath2 ? classpath2 : "")+PATH_SEP+(classpath ? classpath : "");
    options[n++].optionString = (char *)classpathOption.c_str(); /* user classes */
    options[n++].optionString = (char *)"-Djava.library.path=."; /* set native library path */
    //options[n++].optionString = "-Djava.compiler=NONE";    /* disable JIT */
    //options[n++].optionString = "-verbose:jni";            /* print JNI-related messages */
    //options[n++].optionString = "-verbose:class";          /* print class loading messages */

    vm_args.version = JNI_VERSION_1_2;
    vm_args.options = options;
    vm_args.nOptions = n;
    vm_args.ignoreUnrecognized = true;

    int res = JNI_CreateJavaVM(&vm, (void **)&jenv, &vm_args);
    if (res<0)
        opp_error("Could not create Java VM: JNI_CreateJavaVM returned %d", res);

    DEBUGPRINTF("Registering native methods...\n");
    SimkernelJNI_registerNatives(jenv);
    DEBUGPRINTF("Done.\n");
}

Если кто-то знает что-нибудь о том, как это исправить, это будет очень признательно. Спасибо.


person user2049080    schedule 19.08.2013    source источник
comment
Вы упомянули jvm файл статической библиотеки в своем проекте?   -  person nabroyan    schedule 19.08.2013
comment
Я не уверен, каково имя файла статической библиотеки jvm? Если это libjvm.so, то да.   -  person user2049080    schedule 19.08.2013
comment
Пожалуйста, взгляните на этот stackoverflow.com/questions/9923495/   -  person nabroyan    schedule 19.08.2013
comment
В обеих этих ссылках сказано поставить -ljvm после файла, который использует эту библиотеку. Но если я компилирую в Eclipse, как мне это сделать?   -  person user2049080    schedule 20.08.2013
comment
Я думаю, вы должны сделать это в списке зависимостей вашего проекта.   -  person nabroyan    schedule 20.08.2013
comment
Я сделал, я показал это в своем вопросе, но правильно ли это? Я зашел в Project›Properties›Library Paths и добавил его в конец списка.   -  person user2049080    schedule 20.08.2013
comment
Я думаю, вы должны добавить расширение файла   -  person nabroyan    schedule 20.08.2013
comment
Я имею в виду расширение client   -  person nabroyan    schedule 20.08.2013
comment
Хорошо, я добавил, изменил его на -L/usr/lib/jvm/java-6-openjdk/jre/lib/i386/client/libjvm.so -ljvm, и я все еще получаю сообщение об ошибке.   -  person user2049080    schedule 21.08.2013