Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> JNI & UnsatisfiedLinkError 
V
    Опции темы
Metal_Heart
Дата 19.4.2006, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а почему бы и нет?
**


Профиль
Группа: Участник
Сообщений: 728
Регистрация: 31.3.2005
Где: Москва

Репутация: 4
Всего: 12



О Великий форум!
У меня возникла такая проблема с JNI:

Код

public class ComPort
{
//-----------------------------------------------------------------
static
{
 System.loadLibrary("ComPort");
}
//-----------------------------------------------------------------
public  native int  showMessage();       // -  любопытства ради
private native int  closePort(int port);
//-----------------------------------------------------------------
public int portClose(int port)
{
int i=0;
 try{i=closePort(port);}catch(Exception e){System.out.println("(Java::CommPort) Err:closePort("+port+")");}
return i;
}
//-----------------------------------------------------------------
public static void main(String[] str)
{
int i;
int numPort = 4;

 ComPort comPort = new ComPort();
 i=comPort.showMessage();                    System.out.println("(Java::ComPort) showMessage value: \t"+i);
 i=comPort.portClose(numPort);               System.out.println("(Java::ComPort) port is closed? \t"+i);
}
//-----------------------------------------------------------------


в результате имею ВОТ ТАКУЮ ошибку, млин:
Код

(Cpp::ComPort) it's message!
(Java::ComPort) showMessage value:    1

Exception in thread "main" java.lang.UnsatisfiedLinkError: closePort
    at ComPort.closePort(Native Method)
    at ComPort.portClose(ComPort.java:45)
    at ComPort.main(ComPort.java:66)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:585)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:78)


вот нативный код [header]:
Код

/*
 * Class:     ComPort
 * Method:    showMessage
 * Signature: ()I
 */
JNIEXPORT jint JNICALL Java_ComPort_showMessage
  (JNIEnv *, jobject);

/*
 * Class:     ComPort
 * Method:    closePort
 * Signature: (I)I
 */
JNIEXPORT jint JNICALL Java_ComPort_closePort
  (JNIEnv *, jobject, jint);


вот нативный код [source]:
Код

//------------------------------------------------------------------------------
JNIEXPORT jint JNICALL Java_ComPort_showMessage(JNIEnv *, jobject)
{
 printf("(Cpp::ComPort) it's message!\n");

return 1;
}
//------------------------------------------------------------------------------
JNIEXPORT jint JNICALL Java_CommPort_closePort(JNIEnv * jenv, jobject jobj, jint port)
{if(!init) Init();

return ClosePort(port);
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
unsigned int ClosePort(unsigned int port)
{if(!comport) return PORT_CLOSE;

 printf("(Cpp::ComPort) close port: \t%d\n",port);
 try{if(comport->CloseCOMport()!=PORT_CLOSE) {printf("(Cpp::ComPort) Can't close this port: \t%d\n",port); return PORT_ERROR;}}
   catch(...){printf("(Cpp::ComPort) Exeption: closing port: \t%d\n",port); return PORT_ERROR;}

 comport=0;

return PORT_CLOSE;
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


а самое обидное то, что пока я не влез дорабатывать эти исходники (которые сам и писал) оно работало, ёпрст
 


--------------------
 не стыдно учиться, а стыдно не учиться 
PM ICQ   Вверх
LSD
Дата 19.4.2006, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



У тебя в Java классе объявлен метод portClose, а в заголовочном файле Java_ComPort_closePort, естественно он не может найти его. 


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Metal_Heart
Дата 19.4.2006, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а почему бы и нет?
**


Профиль
Группа: Участник
Сообщений: 728
Регистрация: 31.3.2005
Где: Москва

Репутация: 4
Всего: 12



шутить изволите?

Цитата(Metal_Heart @  19.4.2006,  13:25 Найти цитируемый пост)

//-----------------------------------------------------------------
static
{
 System.loadLibrary("ComPort");
}
//-----------------------------------------------------------------
public  native int  showMessage();       // -  любопытства ради
private native int  closePort(int port);
//-----------------------------------------------------------------

 


--------------------
 не стыдно учиться, а стыдно не учиться 
PM ICQ   Вверх
val
Дата 19.4.2006, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Program developer
**


Профиль
Группа: Участник Клуба
Сообщений: 992
Регистрация: 14.1.2003
Где: г. Киев

Репутация: нет
Всего: 7



Не уверен, но мне кажется, что почему-то имеет место конфликт имён, у тебя есть С++ функция ClosePort, которую нельзя дернуть из Java и вместе с тем, есть java-функция  closePort. Попробый как-то по разному их называть. 


--------------------
Терпимость - величайшее благо человечества...
Ярчайший признак интеллекта – постоянно хорошее настроение…
PM MAIL ICQ   Вверх
Metal_Heart
Дата 19.4.2006, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а почему бы и нет?
**


Профиль
Группа: Участник
Сообщений: 728
Регистрация: 31.3.2005
Где: Москва

Репутация: 4
Всего: 12



val, я, конечно, был уверен, что не это, но проверил - ничего не изменилось
 


--------------------
 не стыдно учиться, а стыдно не учиться 
PM ICQ   Вверх
Metal_Heart
Дата 19.4.2006, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а почему бы и нет?
**


Профиль
Группа: Участник
Сообщений: 728
Регистрация: 31.3.2005
Где: Москва

Репутация: 4
Всего: 12



использую JDk1.5.0_06

и чуток упростил Java-код:
Код

public class ComPort
{
//-----------------------------------------------------------------
static
{
 System.loadLibrary("ComPort");
}
//-----------------------------------------------------------------
public  native int  showMessage();       // -  любопытства ради
public  native int  closePort(int port);
//-----------------------------------------------------------------
public static void main(String[] str)
{
int i;
int numPort = 4;
 ComPort comPort = new ComPort();
 i=comPort.showMessage();                    System.out.println("(Java::ComPort) showMessage value: \t"+i);
 i=comPort.closePort(numPort);               System.out.println("(Java::ComPort) port is closed? \t"+i);
}
//-----------------------------------------------------------------
 


--------------------
 не стыдно учиться, а стыдно не учиться 
PM ICQ   Вверх
Metal_Heart
Дата 19.4.2006, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а почему бы и нет?
**


Профиль
Группа: Участник
Сообщений: 728
Регистрация: 31.3.2005
Где: Москва

Репутация: 4
Всего: 12



Докладываю:

Проект был ранее откомпилирован, создан JAR-ик отправлен в JDK/JRE/LIB/EXT/ и подключен к IDE,
в результате чего javah не мог (или не хотел) создавать обнавленный header-файл для С++

т.е. 
Код

//-----------------------------------------------------------------
static
{
 System.loadLibrary("ComPort");
}
//-----------------------------------------------------------------
public  native int  showMessage(int a, int b);       // -  любопытства ради
//  !закоментировано!     private native int  closePort(int port);
//-----------------------------------------------------------------


header всё равно имел вид:
Код

/*
 * Class:     ComPort
 * Method:    showMessage
 * Signature: ()I
 */
JNIEXPORT jint JNICALL Java_ComPort_showMessage
  (JNIEnv *, jobject);
/*
 * Class:     ComPort
 * Method:    closePort
 * Signature: (I)I
 */
JNIEXPORT jint JNICALL Java_ComPort_closePort
  (JNIEnv *, jobject, jint);


Это была проблема №1 - решилась удалением вышеупомянутого JAR-ика как из упоминания в IDE, так и заодно из JDK/JRE/LIB/EXT/ 
Проблема №2 - человеческий фактор, который довольно трудно сразу увидеть:

вот нативный код [header]:
Код

JNIEXPORT jint JNICALL Java_ComPort_closePort ( ...



вот нативный код [source]:
Код

JNIEXPORT jint JNICALL Java_Co[m]mPort_closePort( ...




Так то, вот.  smile  И спасибо всем   

Это сообщение отредактировал(а) Metal_Heart - 20.4.2006, 08:39


--------------------
 не стыдно учиться, а стыдно не учиться 
PM ICQ   Вверх
LSD
Дата 19.4.2006, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(Metal_Heart @  19.4.2006,  15:07 Найти цитируемый пост)
шутить изволите?

Нет, просто перепутал функции. 


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0989 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.