jni getMethodID возвращает Null, когда используется для получения идентификатора конструктора

I have assigned jvm to global variable in a function using

int status = (*jenv)->GetJavaVM(jenv, &jvm);
if(status != 0) {
    printf(" Fail!\n");
         }

classNameC - глобальная переменная, и у ее класса нет конструктора. Затем в другой функции я использую ее следующим образом:

JNIEnv *env;
printf("starting function\n");
(*jvm)->AttachCurrentThread(jvm, (void **)&env, NULL);
printf("thread attached\n");
jclass local = (*env)->FindClass(env,classNameC);
if(local!=NULL)
{
printf("1st class found\n");
}
jmethodID constructor=(*env)->GetMethodID(env,local,"<init>","()V");
if(constructor==NULL)
{
printf("1st Constructoris NULL\n");
}
else
{
printf("1st Constructor created\n");
}
jobject classObject=(*env)->NewObject(env,local,constructor);
if(classObject==NULL)
{
printf("1st object is  NULL\n");
}
else
{
printf("1st object is  created\n");
}

jclass local1 = (*env)->FindClass(env,"SWIGTYPE_p_void");
if(local1==NULL)
{
printf("SWIGTYPE p void class is NULL\n");
}
else
{
printf("SWIGTYPE p void class created\n");
}

Этот конструктор имеет 2 параметра, один из которых длинный, а следующий - логический. Этот класс имеет 2 конструктора, другой не имеет параметров и инициализирует членов с 0.

jmethodID constructor1=(*env)->GetMethodID(env,local1,"<init>","(J;Z;)V");
if(constructor1==NULL)
{
printf("SWIGTYPE p void constructor is NULL\n");
}
else
{
printf("SWIGTYPE p void constructor is created\n");
}

когда я запустил его, он успешно распечатал созданный класс SWIGTYPE p void, и конструктор SWIGTYPE p void имеет значение NULL, а затем выдал эту ошибку:

Неустранимая ошибка была обнаружена средой выполнения Java:

SIGSEGV (0xb) при pc=0x00007f7ec503fa7b, pid=25307, tid=140182441326336

Версия JRE: среда выполнения Java(TM) SE (7.0_65-b17) (сборка 1.7.0_65-b17) Java VM: виртуальная машина 64-разрядного сервера Java HotSpot(TM) (сжатый режим linux-amd64 в смешанном режиме 24.65-b04) фрейм: V [libjvm.so+0x657a7b] JNI_ArgumentPusherVaArg::JNI_ArgumentPusherVaArg(_jmethodID*, __va_list_tag*)+0x1b

Основной дамп написан. Расположение по умолчанию: / home / manish / rathi / libdmc / dmcore / include / core или core.25307

Файл отчета об ошибке с дополнительной информацией сохраняется как: /home/manish/rathi/libdmc/dmcore/include/hs_err_pid25307.log

Если вы хотите отправить отчет об ошибке, посетите:
http://bugreport.sun.com/bugreport/crash.jsp

Прервано (ядро сброшено)

1 ответ

Решение

Ты находишь constructor идентификатор метода; но вы утверждаете, что этот класс не имеет конструктора. Это означает, что GetMethodID(env,local,"<init>","(V)V") вернет 0. Чтобы указать подпись для метода без параметров, используйте "()V",

Другие вопросы по тегам