JNI- FindClass возвращает ноль - PullRequest
       6

JNI- FindClass возвращает ноль

1 голос
/ 19 сентября 2011

Я знаю, что это общая проблема, я искал в Google и посмотрел все на первых 4 страницах, перепробовал много возможностей, но пока ничего не получилось.

Вот часть кода C ++:

JNIEnv* create_vm(JavaVM ** jvm) {

    char * str=(char *)"-Djava.class.path=.";

    JNIEnv *env;

    JavaVMInitArgs vm_args;

    JavaVMOption options;

    options.optionString = str; //Path to the java source code

    vm_args.version = JNI_VERSION_1_6; //JDK version. This indicates version 1.6

    vm_args.nOptions = 1;

    vm_args.options = &options;

    vm_args.ignoreUnrecognized = 0;



    int ret = JNI_CreateJavaVM(jvm, (void**)&env, &vm_args);

    if(ret < 0)

        printf("\nUnable to Launch JVM\n");     

    return env;

}



int main(int argc, char* argv[])

{

    JNIEnv *env;

    JavaVM * jvm;

    env = create_vm(&jvm);

    if (env == NULL)

        return 1;




    jclass clsMain=NULL;
    jmethodID mid = NULL;

    //Obtaining Classes
    clsMain = env->FindClass("Main");

    //Obtaining Method IDs
    if (clsMain != NULL)
    {
        mid       = env->GetStaticMethodID(clsMain, "myMethod", "(Ljava/lang/String;)Z");
    }
    else
    {
        printf("\nUnable to find the requested class\n");    //this runs    
    }

...

Я не знаю, как отловить исключение и узнать его имя в JNI.

Кроме того, Main.class находится в том же каталоге, где файл имеет эту часть кода C ++.


Изменить:

Я добавляю эти строки, чтобы найти исключение из Java после строки FindClass:

clsMain = env->FindClass("Main");

jthrowable exc;
exc = env->ExceptionOccurred();
     if (exc) {
         jclass newExcCls;
         env->ExceptionDescribe();
         env->ExceptionClear();

     }

затем выдает NoClassDefFoundException

таким образом я редактирую JavaVMInitArgs.options

Я имею в виду, я редактирую:

char * str=(char *)"-Djava.class.path=.";

строка:

 char * str=(char *)"-Djava.class.path=/path/to/my/jars:/path/to/my/other/jars:."; 

сейчас все хорошо. Спасибо

Ответы [ 3 ]

1 голос
/ 19 сентября 2011

NoClassDefFoundError происходит, когда JVM не смогла найти класс во время выполнения, и класс еще не был найден компилятором во время компиляции.

Таким образом, ваша проблема, вероятно, связана с содержанием вашего Java-кода и / или определением вашего пути к классам. Ваш код Java, вероятно, вызывает класс, который недоступен в текущем каталоге.

Что вам нужно сделать, это создать файл jar со всем, что нужно для вашего вызова JNI.

0 голосов
/ 19 марта 2016

Я попробовал методы, упомянутые выше, на моем Mac, и это не сработало. Наконец, я распаковал свои jar-файлы и поместил их в папку проекта, теперь она работает для меня.

0 голосов
/ 09 октября 2013

Примечание: В Windows используйте «;» в качестве разделителя пути к классам вместо ":".

 options[0].optionString = "-Djava.class.path=<path_to_my_java_class>:<path_to_my_jar_file>";
...