2011-10-23 8 views
0

나는 병렬 포트를 읽고 쓰려고하는데, 나는 C로 쓰고 읽을 것을 구현했다. 이제이 코드를 자바 GUI 애플리케이션으로 가져오고 싶다. 자바 프로젝트에 C .so 파일을 포함 할 수 있었고 Java 솔루션의 main() 메소드에서 직접 함수를 호출 할 때 제대로 작동합니다.자바 스윙 GUI에서 네이티브 C 코드 호출

버튼을 눌렀을 때 기본 함수를 호출하려고했지만 작동하지 않으면 응용 프로그램이 충돌합니다. 응용 프로그램을 루트 권한으로 실행하고 있으며 루트 권한은 변경하고 병렬 포트 값을 읽는 데 필요합니다.

어떻게 네이티브 함수를 호출하는 것을 시도하고있다 :

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); 
} 

충돌 메시지 : 긴 게시물에 대한

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. 

죄송합니다. 아무도 도와 줄 수 있습니까?

+0

이 필요한 중 스레드에서 네이티브 C를 호출 할 괜찮아요 ... 문제가 JNA로 변경하여 해결되지 않습니다하지만 JNA는, JNI에 비해 작업 할 고통의 약간 덜 생각 에 부름 받았다. JNA 또는 JNI를 사용하는 경우, 어떤 오류가 표시되는지와 같은 세부 사항을 숨기고있는 것 같습니다. 스윙 앱인가요? –

+3

'OnButtonDown() '이란 무엇입니까? J2SE에서는 클래스도 메소드도 아닙니다. * "응용 프로그램이 충돌합니다"* 예외/오류 출력은 무엇입니까? (우리는 초능력도 아니고 컴퓨터 앞에 앉아있는 척하지도 않습니다.) –

+0

BTW - 첫 번째 2 개의 댓글에서 네 가지 질문 ('?'로 끝나는 것)을 받았습니다. 귀하의 질문은 무엇인가? –

답변

1

JNI를 사용하고 GUI를 루트로 실행하는 대신 C 부분을 최소한의 권한 (즉, 병렬 포트에 바인딩 한 다음 다른 모든 권한을 취소 함)으로 실행하는 독립 실행 형 프로그램으로 만듭니다. 네트워크 소켓을 통해 자바 애플리케이션과 대화한다. 그렇게하면 최종 사용자가 직면하는 부분과 상승 된 권한을 갖는 부분 사이를 통과하는 부분과 공격에 덜 취약한 부분을보다 효과적으로 제어 할 수 있습니다. 또한 GUI 부분을 포함하지 않고 telnet 또는 netcat을 사용하여 C 프로그램에 대한 네트워크 통신을 테스트 할 수 있기 때문에 디버그 및 테스트가 더 쉬울 것입니다.

+0

이것이 올바른 방법이라고 생각합니다.하지만 여전히 내 코드에 무슨 문제가 있는지 모르겠습니다 .... – Borissow

0

전적으로 독립 실행 형 프로그램을 만들 필요는 없지만 인터페이스 클래스를 만들어야 포트가 제대로 설정되고 jang 호출을 직렬화해야합니다. gui에서 직접 하드웨어에.

이외에도 JUnit 테스트를 작성하고 병렬 포트 프로그래밍에 대해 좀 더 연구하십시오. (http://as6edriver.sourceforge.net/Parallel-Port-Programming-HOWTO/accessing.html)

jvm에서 코어 덤프가 있다고 가정하지 않습니까? 생성 된 로그를 읽었습니까?

는, BTW 나는

+0

조언을 주셔서 감사합니다. 그것을 들여다 보아라. – Borissow