设为首页 收藏本站
查看: 764|回复: 0

[经验分享] Eclipse 导入NetFPGA JAVA GUI代码 _ Windows Centos

[复制链接]

尚未签到

发表于 2016-5-12 09:56:54 | 显示全部楼层 |阅读模式
最近老板的东西,要将斯坦福大学开发的NetFPGA版中的Java的GUI界面重新写一遍,为了进行代码的阅读和运行,需要在IDE工具下来进行二次开发,里面的Java的代码量虽然不大,不过也涉及到了或多或少的综合方面的知识,将源代码导入进去,是不可能直接运行成功的,因为斯坦福大学做的时候,是将上层界面和底层数据的获取编在了一起,有很大的耦合性。
刚刚做了几天的代码阅读,代码量没有之前想象的那么大,将目前阅读过的代码的层次结构进行列举如下:
四个文件包:
org.netfpga.backend
org.netfpga.graphics
org.netfpga.mdi
org.netfpga.router

其中比较重要的是backend(底层寄存器操作)和router(上层显示界面)两个文件包,将自己读过的比较重要文件的主要功能列举如下:
org.netfpga.backend.NFDeviceJava对NF的抽象对象,对底层操作的最底层的封装
org.netfpga.backend.NFRegAccess一个接口,用来将动态文件加载成功并强制转换成该对象类型
org.netfpga.backend.Register对底层寄存器的对象封装
org.netfpga.backend.RegTableModel对AbstractTableModel的一种重写,这个类是其他上层界面进行界面显示的两个重要的model之一
org.netfpga.backend.WideRegTableModel对AbstractTableModel的一种重写,这个类是其他上层界面进行界面显示的两个重要的model之一
org.netfpga.router.AbstractMainFrameJavaGUI启动的主要入口的一个抽象对象,也就是说启动的时候,从该抽象对象的自对象作为入口
org.netfpga.router.RouterMainFrameAbstractMainFrame的唯一实现,是程序的唯一入口
org.netfpga.router.AbstractRouterQuickstartFrame作为二层frame来进行的一个主要入口,也是项目中代码量最大的一个单文件,这也是斯坦福大学NetFPGA中的Java的GUI界面开发采用的思路,使用了JInternalFrame这样的frame来进行二层frame的开发,具体的信息查看jdk的文档
org.netfpga.router.RouterQuickstartFrameAbstractRouterQuickstartFrame的唯一实现
org.netfpga.router.ARPTableModel界面部分的重要组成之一,进行model中相应的模块的定义,事件的响应
org.netfpga.router.InterfacePortConfigTableModel界面部分的重要组成之一,进行model中相应的模块的定义,事件的响应
org.netfpga.router.RoutingTableModel界面部分的重要组成之一,进行model中相应的模块的定义,事件的响应
org.netfpga.router.StatsRegTableModel界面部分的重要组成之一,进行model中相应的模块的定义,事件的响应


在CentOS下,当加载了相应的bit文件到NetFPGA板上,并且配置了各个nf2c的四个端口,运行./router.sh,Java的GUI界面便可以正常启动,但这是有如下两个条件才成功的:

  • 正常加载了libnf2.so文件,这是java用jna库来加载c生成的动态文件
  • 加载了相应的bit文件到NetFPGA板上,并且配置了各个nf2c的四个端口

那么如果将java的GUI界面导入Eclipse(个人认为,Java编写的首选IDE工具)之后,运行org.netfpga.router.RouterMainFrame.java,会出现无法加载“nf2”的错误,这是因为加载动态连接 库出现了问题导致的。进过代码底层的阅读,我将自己的解决方法列举如下,达到了在Windows的Eclipse下,正常启动了Java的GUI界面,不过这只是正常启动上层GUI界面,我之后要做的是,用Java的Socket编程进行远端连接Host,然后进行配置、显示并可以对一台Host上1台或者2台NetFPGA的板卡进行相应数据的配置、显示等,这包括Router、Ip、Mac、ARP等信息。

  • 将所需要的jar文件导入到自己的工程下,并将Java代码导入到工程中
  • 将需要用到底层访问寄存器的org.netfpga.backend.NFRegAccess.java中的“NFRegAccess INSTANCE = (NFRegAccess)Native.loadLibrary("nf2", NFRegAccess.class);”代码注释掉。
  • 修改org.netfpga.backend.NFDevice.java代码,修改内容如下,修改的主要内容是将所有用到了底层访问寄存器的操作全部注释掉,替换成简单的操作,使得可以运行成功


package org.netfpga.backend;
//import com.sun.jna.ptr.IntByReference;
public class NFDevice {
public static final int WRITE_ACCESS = 0;
public static final int READ_ACCESS = 1;
private NFRegAccess.NF2 nf2 = new NFRegAccess.NF2 ();
public NFDevice(){};
public NFDevice(String ifaceName) {
this.nf2.device_name = ifaceName;
this.nf2.fd = 0;
this.nf2.net_iface = 0;
}
public NFDevice(String ifaceName, int fileDescriptor, int netIface) {
this.nf2.device_name = ifaceName;
this.nf2.fd = fileDescriptor;
this.nf2.net_iface = netIface;
}
/**
* Read the register at the specified address
* @param addr
* @return the value at the address
*/
public int readReg(long addr) {// modified by yuanbo 2011-03-16
/* create pointer to int */
//    IntByReference val = new IntByReference();
//    NFRegAccess.INSTANCE.readReg(nf2, (int)addr, val);
//    return val.getValue();
return 1;
}
/**
* Write value to the specified address
* @param addr the location to write
* @param value the value to write
*/
public void writeReg(long addr, int val) {// modified by yuanbo 2011-03-16
//    NFRegAccess.INSTANCE.writeReg(nf2, (int)addr, val);
}
/**
* Perform all operations in the array in one go
* @param addr the locations to read/write
* @param value the values to read/write
* @param access_types for each location, a 1 is a read, a 0 is a write
* @param num_accesses the number of addresses in the array to read/write
* @return
*/
public void accessRegArray(long []addr, int []value, int[] access_types, int num_accesses) {// modified by yuanbo 2011-03-16
//        int i;
//
//        /* perform the accesses */
//        for(i=0; i<num_accesses; i=i+1) {
//            if(access_types==WRITE_ACCESS) {
//            writeReg(addr, value);
//            } else if (access_types==READ_ACCESS) {
//                value = readReg(addr);;
//            }
//        }
}
/**
* check if the interface exists
* @return 1 on error
*/
public int checkIface() {// modified by yuanbo 2011-03-16
//    return NFRegAccess.INSTANCE.check_iface(nf2);
return 0;
}
/**
* Opens the interface for access
* @return non-zero on error
*/
public int openDescriptor() {// modified by yuanbo 2011-03-16
//    return NFRegAccess.INSTANCE.openDescriptor(nf2);
return 0;
}
/**
* Closes the file descriptor
* @return non-zero on error
*/
public int closeDescriptor() {// modified by yuanbo 2011-03-16
//    return NFRegAccess.INSTANCE.closeDescriptor(nf2);
return 0;
}
public String getIfaceName() {// modified by yuanbo 2011-03-16
//return nf2.device_name;
return "test in NFDevice";
}
public void setIfaceName(String devName) {
//nf2.device_name = devName;
}
}


到此,你便可以正常启动org.netfpga.router.RouterMainFrame.java来启动Java的GUI界面了,进行二次开发便容易一些,不过要使用这些已经存在的代码来进行自己的开发不是几天能搞定的,他的代码耦合性比较大,没有考虑过二次开发的问题我觉得,要将界面和底层的寄存器访问操作分离,并加入网络编程进行远程操作,而且处理一台主机多台NetFPGA板卡的情况。之后的操作会在博客中继续更新。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-215947-1-1.html 上篇帖子: 通用 CentOS 6 服务器安全配置指南 下篇帖子: CentOS 5.5 安装记录
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表