Форум программистов, компьютерный форум, киберфорум
Наши страницы
Java
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
AlikAlik
1 / 1 / 1
Регистрация: 10.08.2016
Сообщений: 9
1

JNI fatal error

21.09.2016, 12:45. Просмотров 828. Ответов 5
Метки нет (Все метки)

Добрый день!

Возникла проблема при работе с созданной мной dll через нативный интерфейс.
В созданной мною dll реализована функция, принимающая на вход несколько целых и вещественных массивов.
Библиотека без проблем компилируется и загружается, но при вызове моей функции из приложения java всё рушится:

# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x64fd17a7, pid=8320, tid=8692
#
# JRE version: Java(TM) SE Runtime Environment (8.0_25-b18) (build 1.8.0_25-b18)
# Java VM: Java HotSpot(TM) Client VM (25.25-b02 mixed mode, sharing windows-x86 )
# Problematic frame:
# V [jvm.dll+0x17a7]

Начал разбираться в чём дело. Сначала убрал весь код из функции и заново скомпилировал библиотеку - всё норм, работает.
Затем поочередно стал добавлять выражения. Начало выглядит так:

jint *ptElems, *iaElems, *jaElems, *permElems, *iparmElems;
jfloat *aElems, *bElems, *xElems;

ptElems = (*env)->GetIntArrayElements (env, pt, NULL);
iaElems = (*env)->GetIntArrayElements (env, ia, NULL);
jaElems = (*env)->GetIntArrayElements (env, ja, NULL);
permElems = (*env)->GetIntArrayElements (env, perm, NULL);
aElems = (*env)->GetFloatArrayElements (env, a, NULL);
bElems = (*env)->GetFloatArrayElements (env, b, NULL);
xElems = (*env)->GetFloatArrayElements (env, x, NULL);

То есть просто выделяю память под массивы средствами JNI. Оказалось, что если оставить только одно или два выражения, например так:

jint *ptElems, *iaElems, *jaElems, *permElems, *iparmElems;
jfloat *aElems, *bElems, *xElems;

ptElems = (*env)->GetIntArrayElements (env, pt, NULL);
iaElems = (*env)->GetIntArrayElements (env, ia, NULL);

Всё по прежнему работает. Но когда я выделяю память под 3 и более массивов, функция перестаёт работать и её вызов приводит к ошибке. Также я пытался внутрь функции запихать вызов printf для файла C или cout<< для файла С++ чтобы вывести какое нибудь сообщение, но эти функции тоже приводят к ошибке.

В чём может быть дело?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.09.2016, 12:45
Ответы с готовыми решениями:

Ошибка в oracle: FATAL ERROR in native method: JDWP "stepControl.c" (Aug 19 2003), line 86:
Во время работы системы возникает ошибка FATAL ERROR in native method: JDWP...

JNI
как запускать JNI что бы можно было использовать функции С/С++ в Java можете...

Java JNI. Возврат из функций
Пишу dll на ассемблере для подключения к Java через JNI. Не могу разобраться с...

JNI, передача и возврат указателя
Все здрасьте. Использую JNI, хочу передавать между java и с++ указатель....

Вызов C++ dll без использования JNI
Можно ли вызывать функции dll которые написаны &quot;в стиле&quot; С (без JNI): ...

5
turbanoff
Эксперт Java
4018 / 3753 / 741
Регистрация: 18.05.2010
Сообщений: 9,329
Записей в блоге: 11
Завершенные тесты: 1
21.09.2016, 21:55 2
По этому кусочку сложно что-то понять. Насколько я вижу падает, уже при возврате в java код, а не сам C код. Так что проблема вряд ли в этих 5-ти строчках
0
AlikAlik
1 / 1 / 1
Регистрация: 10.08.2016
Сообщений: 9
22.09.2016, 09:09  [ТС] 3
С помощью assert(0) убедился, что не происходит выход из очередного метода GetIntArrayElements. Понятно что в приведённом С коде просто негде ошибиться
Может проблема быть с неправильными параметрами при компиляции или с различной разрядностью:
у меня процесор 64 бит, java и соответственно приложение 32 бит, подключаемая библиотека 32 бит?
0
turbanoff
Эксперт Java
4018 / 3753 / 741
Регистрация: 18.05.2010
Сообщений: 9,329
Записей в блоге: 11
Завершенные тесты: 1
22.09.2016, 15:59 4
Java не смогла бы загрузить dll-ку не своей разрядности. Проблема в чём-то ещё. Без исходников/скриншотов не понять
0
AlikAlik
1 / 1 / 1
Регистрация: 10.08.2016
Сообщений: 9
23.09.2016, 06:39  [ТС] 5
Какие нужны исходники?
0
AlikAlik
1 / 1 / 1
Регистрация: 10.08.2016
Сообщений: 9
24.09.2016, 14:57  [ТС] 6
Лучший ответ Сообщение было отмечено turbanoff как решение

Решение

Всё вопрос решился!
Собрал в Visual Studio и всё работает.
До этого собирал с помощью Cygwin (компилятор gcc) в командной строке. Видимо ручки кривые
0
24.09.2016, 14:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.09.2016, 14:57

JNI. Как создать динамический массив jobject-ов
Всем привет! Под фиксированный размер - с помощью env-&gt;NewObjectArray. А как...

[JNI] Освобождение памяти при использовании GetStringUTFChars и ReleaseStringUTFChars
Здравствуйте. Только начал изучать JNI и возник вопрос: Если вызвать char *str...

[Linker Fatal Error] Fatal: Could not open ~CBuilder6\Projects\Project1.exe (error code 5)
Инсталировал с++ builder 6. Запустил програму и попробывал компилировать пустую...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru