Собственный вызов кода C из Java Swing GUI - PullRequest
0 голосов
/ 23 октября 2011

Я пытаюсь читать и писать в параллельный порт, я реализовал запись и чтение в C, теперь я хочу импортировать этот код в приложение Java с графическим интерфейсом.Мне удалось включить файл .so в проект Java, и при вызове функций непосредственно в методе main () решений Java они работают просто отлично.

Я пытался вызывать собственные функции при нажатии кнопки, но это не сработало, приложение зависало.Я запускаю приложение как root, привилегия root необходима для изменения и чтения значений параллельных портов.

Как я пытаюсь вызвать нативную функцию:

 private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
       try
       {
           int portNR=Integer.parseInt(jTextField1.getText());
           int value=Integer.parseInt(jTextField2.getText());
        ParalellComanderApp.setPort(portNR,value );
       }
       catch (Exception e)
       {
           System.err.println(e.getMessage());
       }
    }

Нативная функция вC:

JNIEXPORT void JNICALL Java_paralellcomander_ParalellComanderApp_setPort
  (JNIEnv *env, jobject obj, jint port, jint value)
{
     outb(value,MAIN_PORT+port); 
     printf("Setting port %d to value %d\n",port,value);
}

Crash message:

    A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x00007f00adaf9833, pid=6516, tid=139640785835776
#
# JRE version: 6.0_23-b23
# Java VM: OpenJDK 64-Bit Server VM (20.0-b11 mixed mode linux-amd64 compressed oops)
# Derivative: IcedTea6 1.11pre
# Distribution: Ubuntu oneiric (development branch), package 6b23~pre10-0ubuntu5
# Problematic frame:
# C  [libAccessParalel.so+0x833]  inb+0x17
#
# An error report file with more information is saved as:
# /home/bari/NetBeansProjects/ParalellComander/dist/hs_err_pid6516.log
#
# If you would like to submit a bug report, please include
# instructions how to reproduce the bug and visit:
#   https://bugs.launchpad.net/ubuntu/+source/openjdk-6/
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.

Извините за длинный пост.Кто-нибудь может мне помочь?

Ответы [ 2 ]

1 голос
/ 23 октября 2011

Вместо того, чтобы использовать JNI и запускать ваш графический интерфейс в качестве пользователя root, я бы превратил часть C в отдельную программу (которая работает с минимальными привилегиями - то есть она связывается с параллельным портом, а затем отзывает все другие привилегии), которая говорит к приложению Java через сетевой сокет. Таким образом, вы получаете больший контроль над тем, что проходит между частью, обращенной к конечному пользователю, и частью, которая имеет повышенные привилегии, и менее уязвима для атак. Также было бы проще отлаживать и тестировать, потому что вы можете проверить сетевое взаимодействие с программой на C, используя telnet или netcat, даже не задействовав часть GUI.

0 голосов
/ 23 октября 2011

Я не думаю, что необходимо создавать полностью автономную программу, но вы должны создать интерфейсный класс, который гарантирует, что порт настроен правильно, а также сериализовать jni-вызовы, а не стучать поаппаратное обеспечение непосредственно из графического интерфейса.

Кроме этого, напишите хороший тест JUnit и исследуйте еще немного о программировании параллельного порта.(http://as6edriver.sourceforge.net/Parallel-Port-Programming-HOWTO/accessing.html)

Я не думаю, что у вас есть дамп ядра из jvm? Вы читали журналы, которые были сгенерированы?

Кстати, я думаю, что с JNA работать немного сложнеечем JNI, хотя ваша проблема не будет решена путем перехода на JNA ...

...