用JNI封装了一个Win32 dll(读取特定文件),swing GUI调用时,JNI方法返回结果都正常,但是调用该方法一次以后,GUI上未加载的界面(JFrame,JDialog,JPanel)打开后,上面的图片(如JButton,JLabel图标等)会部分丢失,在调用JNI方法前已经加载的界面上的图片则还在。java无任何错误输出,多次调用该方法后GUI内存也无明显增长。请问这可能是什么原因呢?

解决方案 »

  1.   

    这个不应该是JNI造成的吧,调用方法之后swing是不是发生重绘了?
    到底什么情况,楼主说的再具体点
      

  2.   

    调用该JNI方法前,图片之前显示过的,再调用都还在,没有显示过的,调用就不显示了感觉是调用JNI方法后资源无法加载进JVM了??比如说调用该JNI方法后,打开一个未开过的JDialog,上面某JButton上应有的图片不显示了。但是调试输出ImageIcon ico = (ImageIcon)Btn_xxx.getIcon();发现ico确实存在调试查看
    "ico"= ImageIcon  (id=345)
    accessibleContext= null
    description= ".\\img\\new.gif"
    filename= ".\\img\\new.gif"
    height= -1
    image= ToolkitImage  (id=363)
    imageObserver= null
    loadStatus= 4
    location= null
    width= -1


    Btn_xxx.repaint();

    Btn_xxx.updateUI();还是一样,不显示该按钮图标。
      

  3.   

    那你的JNI对界面有重绘操作?JNI都做什么了?调用完dll之后,有没有new什么东西放在界面上,把原来的按钮遮住了?感觉你这个还是重绘有点问题,有点怪异啊,呵呵。
      

  4.   

    好像是有问题,下面是一个加载正常的imageIcon:
    "ico"= ImageIcon  (id=429)
    accessibleContext= null
    description= ".\\img\\icon\\refresh.gif"
    filename= ".\\img\\icon\\refresh.gif"
    height= 24
    image= ToolkitImage  (id=431)
    imageObserver= null
    loadStatus= 8
    location= null
    width= 24 看了一下JDK,loadStatus = 8 是图像正常, loadStatus  = 4 是图像加载错误/**
         * Flag indicating that the downloading of media encountered 
         * an error.
         * @see         java.awt.MediaTracker#statusAll
         * @see         java.awt.MediaTracker#statusID
         */
        public static final int ERRORED = 4;    /**
         * Flag indicating that the downloading of media was completed 
         * successfully.
         * @see         java.awt.MediaTracker#statusAll
         * @see         java.awt.MediaTracker#statusID
         */
        public static final int COMPLETE = 8;
      

  5.   

    JNI只是读取特定格式的文件,返回文件中存储的点信息,返回都正常。没有其他对界面的操作啊,调用后其他所有的界面上未加载的图标都加载失败了是好怪异,可能是封装的dll的问题吗
      

  6.   

    又试了一下,把图片的相对路径设为绝对路径,图片居然显示了。String relativelyPath=System.getProperty("user.dir"); Btn_xxx.setIcon(new ImageIcon(relativelyPath + "\\img\\new.gif")) ;相对路径还是无法显示。Btn_AddPortGroup.setIcon(new ImageIcon(".\\img\\new.gif"));是调用jni方法后,把".\\"的相对路径更改了么?这个在java里哪里可以改?