Мерзкий JNI - java.lang.UnsatisfiedLinkError

Тема в разделе "WASM.ZEN", создана пользователем volodya, 30 мар 2005.

  1. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    Спасибо добрым людям, подсказали решение тут:



    http://www.wasm.ru/forum/index.php?action=vthread&forum=7&topic=9332



    теперь надо спортировать на гадкую жабу. Тупая жаба printf не имеет, поэтому пришлось заморачиваться с JNI. Настрадал .h/.c-файлы - заюзал javah -jni



    Жабный класс выглядит так:


    Код (Text):
    1.  
    2. public class ProcessMeter
    3. {
    4.     public native void printLineNo(int lineno);
    5.    
    6.     static
    7.     {
    8.         //System.loadLibrary("processmeter");
    9.         System.load("C:/processmeter/processmeter/processmeter/Release/process meter.dll");
    10.     }
    11. }
    12.  




    Код нативного метода выглядит так:


    Код (Text):
    1.  
    2. #include <jni.h>
    3. #include "ProcessMeter.h"
    4. #include <stdio.h>
    5.    
    6. JNIEXPORT void JNICALL Java_ProcessMeter_printLineNo
    7.   (JNIEnv *env, jobject obj, jint lineno)
    8. {
    9.     fprintf(stderr, "\rline is: %d", lineno);
    10. }
    11.  




    Код ProcessMeter.h автосгенерирован javah.



    Далее юзаю жабный класс вот так:


    Код (Text):
    1.  
    2. ProcessMeter p_meter = new ProcessMeter();
    3. p_meter.printLineNo(lineno);
    4.  




    и жабная JVM слетает, зараза:


    Код (Text):
    1.  
    2. java.lang.UnsatisfiedLinkError: printLineNo
    3. at jimporter.parsers.ProcessMeter.printLineNo(Native Method)
    4. jimporter.Jimporter.main(Jimporter.java:215)
    5. Exception in thread "main"
    6.  




    ПАДЛА!!!

    Я уж попробовал сунуться в dll - быть может, думаю, где-то с вызовами напортачил. Записал .def-файл вида:


    Код (Text):
    1.  
    2. EXPORTS
    3. Java_ProcessMeter_printLineNo
    4.  




    Смотрел в экспорт РЕ-редактором - имя такое как и указал в def-файле.



    НУ ЧЕГО ЭТОЙ ГАДОСТИ ОТ МЕНЯ ЕЩЕ НУЖНО????
     
  2. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
  3. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    Угу, действительно, надо менять сигнатуру метода на полный путь. Тогда работает.



    Единственное что, все сделал :) Все запускается. Вот только fprintf(stderr, "\rline is: %d", lineno); ОПЯТЬ НЕ РАБОТАЕТ!!!!



    Ну что же это за наказание такое???
     
  4. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    Йес!!! Заработало :)

    Это Eclipse шуточки с консолью шутит. В остальном - все нормально.
     
  5. Stiver

    Stiver Партизан дзена

    Публикаций:
    0
    Регистрация:
    18 дек 2004
    Сообщения:
    812
    Адрес:
    Germany
    volodya





    Java 5 имеет, в классах PrintStream и PrintWriter
     
  6. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    И System.out.println() есть, но таким образом нельзя писать по заданным координатам на экране, менять цвет символов и т.д.
     
  7. bsl_zcs

    bsl_zcs New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2003
    Сообщения:
    17
    Адрес:
    Karaganda, Kazakhstan
    Всем привет. Давно не видел. У вас, я вижу, всё по-старому. :)



    Quantum

    printf-ом тоже нельзя ничего этого делать. Им можно только символы в выходной поток посылать, а как их воспринимать - это уже дело, в данном случае, терминала.

    И в этом плане printf ничем не лучше и ничем не хуже System.out.println().

    А Stiver прав - в пятой жабе аналог printf есть.



    volodya

    Если тебя устраивает то, что в настоящей консоли работает, а в оболочкиной нет, то ты с тем же успехом можешь пользоваться всем набортным и не плодить лишних сущностей.
    Код (Text):
    1. for(int a=1; a<10; a++) System.out.print(a+"\r");


    А если целевой терминал поддерживает какой-нить vt-100, то и те escape-последовательности можно спокойно посылать.
     
  8. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    bsl_zcs

    Привет!



    Форматирование в Java поддерживается испокон веков. Есть класс java.text, который ничем не хуже PrintStream.printf.





    Для этого в Win32 предусмотрены 2 функции: SetConsoleTextAttribute и SetConsoleCursorPosition. После этого printf, WriteConsole и т.д. будут печатать по заданым координатам и установленым цветом.
     
  9. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Quantum

    > Для этого в ГРАБЛИ3232 предусмотрены 2 функции



    О каких это ты граблях пишешь? :)))
     
  10. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Asterix

    Это праздничный мод мои слова коверкает :) Скажи спасибо Димону :) Там ещё баян вместо слова "полосатый мух" есть :) ЛОЛ :)))