JNI FindClass не работает с импортом - PullRequest
2 голосов
/ 17 августа 2011

Я пытаюсь вызвать свой класс java из c ++ (ms vc 2008) с помощью JNI, но проблема в том, что FindClass работает только тогда, когда в моем классе java нет импортированных пакетов. Если я добавлю какой-либо пакет (например, java.lang.String или java.io.File), FindClass завершится ошибкой и не вернет никакого значения. Почему?

C ++ КОД: /////////////////////////////////////

JNIEnv *env;
JavaVM * jvm;
JavaVMInitArgs vm_args;
JavaVMOption options;
options.optionString = "-Djava.class.path=c:\\mypackage.jar";
vm_args.version = JNI_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(env == NULL)
    printf("\nJVM Failed\n");       

jclass cls = env->FindClass("mypackage/test/MyClass");

if(cls==0)
{
printf("\nFindClass Failed\n");
}

JAVA-код: //////////////////////////////////////

package mypackage.test;

import java.io.File;   //if I comment this row, FindClass works...

public class MyClass {

}

UPDATE:

ЭТО МОЙ КОД: http://www.sendspace.com/file/233tfm

  • копия в C: \ JNITest
  • изменить рабочий каталог в свойствах \ отладочных настроек проекта
  • проверить optionString в JNI_test1.cpp

большое спасибо, Риккардо

Ответы [ 3 ]

0 голосов
/ 17 августа 2011

ВМ не может найти rt.jar и все остальные классы. Этот вопрос предлагает запустить JNI_GetDefaultJavaVMInitArgs(&vm_args);, прежде чем устанавливать другие параметры.

0 голосов
/ 19 августа 2011

Я нашел проблему. Если я выберу в Eclipse \ Jar Export \ опцию «Экспорт сгенерированных файлов классов и ресурсов» И добавлю некоторый импорт в свой java-класс, сгенерированный JAR-файл не будет включать в себя какой-либо файл .class. Вместо этого опция «Экспортировать все выходные папки для проверенных проектов» работает в любое время. Я не знаю почему, но я буду расследовать.

0 голосов
/ 17 августа 2011

Полагаю, это может быть потому, что при создании JVM ваш путь к классу будет только c: \ mypackage.jar. Я думаю, что путь к классу системы должен быть указан. Путь к классу может быть установлен как options.optionString = "-Djava.class.path = c: \ mypackage.jar; C: \ jdk1.6.0_18 \ jre \ lib \ rt.jar"; Пожалуйста, измените в зависимости от того, где находится rt.jar в вашей системе ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...