2011-10-23 61 views
0

我想讀取和寫入並行端口,我實現了寫入和讀取在C中,現在我想要將該代碼導入到一個Java GUI應用程序。 我設法將C .so文件包含到java項目中,並且在Java解決方案main()方法中直接調用函數時,它們工作得很好。從Java Swing GUI調用本地C代碼

我試圖在按下按鈕時調用本機函數,但它不起作用,應用程序崩潰。我以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); 
} 

崩潰的消息:

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或JNI,您看到了哪些錯誤?這是一個Swing應用程序嗎? –

+3

什麼是OnButtonDown()?它在J2SE中既不是類也不是方法。 *「應用程序崩潰」*什麼是異常/錯誤輸出? (假裝我們既不是精神病患者,也不是坐在電腦前。) –

+0

順便說一句 - 在第2條評論中,你被問了4個問題(那些以'?'結尾的東西)。你的問題是什麼? –

回答

1

而不是使用JNI並以root身份運行您的GUI,我會將C部分變成一個獨立的程序(它以最小的特權運行 - 即它綁定到並行端口,然後撤消所有其他特權)通過網絡套接字與Java應用程序通話。這樣,您就可以更好地控制面向最終用戶的部分和具有較高權限的部分之間傳遞的內容,並且不易受到攻擊。調試和測試也更容易,因爲您可以使用telnet或netcat測試與C程序的網絡通信,而不涉及GUI部分。

+0

我想這是做到這一點的正確方法,但我仍然不知道我的代碼有什麼問題.... – Borissow

0

我不認爲有必要創建一個完全獨立的程序,但是您應該創建一個接口類,它確保端口設置正確,並且序列化jni調用,而不是撞擊直接從gui的硬件上。

除此之外,編寫一個很好的JUnit測試,並研究一些關於並行端口編程的內容。 (http://as6edriver.sourceforge.net/Parallel-Port-Programming-HOWTO/accessing.html)

我不認爲你有從JVM核心轉儲?你讀過生成的日誌嗎?

順便說一句,我認爲JNA略少痛比JNI工作,但你的問題不會通過改變JNA得到解決......

+0

感謝您的建議,我會了解更多 – Borissow