0

我正在尝试读取和写入并行端口,我用 C 实现了写入和读取,现在我想将该代码导入 java GUI 应用程序。我设法将 C .so 文件包含到 java 项目中,当直接在 Java 解决方案 main() 方法中调用函数时,它们工作得很好。

我试图在按下按钮时调用本机函数,但它不起作用,应用程序崩溃。我以 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中的Native函数:

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.

对不起,很长的帖子。有谁能够帮我?

4

2 回答 2

1

我不会使用 JNI 并以 root 身份运行您的 GUI,而是将 C 部分变成一个与 Java 对话的独立程序(以最低权限运行 - 即它绑定到并行端口,然后撤销所有其他权限)应用程序通过网络套接字。这样,您就可以更好地控制在面向最终用户的部分和具有提升权限的部分之间传递的内容,并且不易受到攻击。调试和测试也更容易,因为您可以使用 telnet 或 netcat 测试与 C 程序的网络通信,甚至无需涉及 GUI 部分。

于 2011-10-23T13:38:15.130 回答
0

我认为没有必要创建一个完全独立的程序,但是您应该创建一个接口类,以确保正确设置端口,并序列化 jni 调用,而不是直接从硬件上敲打gui。

除此之外,编写一个好的 JUnit 测试,并研究更多关于并行端口编程的知识。(http://as6edriver.sourceforge.net/Parallel-Port-Programming-HOWTO/accessing.html)

我不认为你有来自 jvm 的核心转储?你读过生成的日志吗?

顺便说一句,我认为 JNA 的使用比 JNI 稍微少一些痛苦,尽管您的问题不会通过更改为 JNA 来解决......

于 2011-10-23T14:36:30.793 回答