解决在loongson机器上eclipse内置游览器报的错误

来源:互联网 发布:笔刷软件app 编辑:程序博客网 时间:2024/05/16 06:19

在龙芯的机器上用eclipse的内置游览器打开一个xml文件,报了这样的错误:
Embedded browser not available
Problem detail
The embedded browser widget for this editor cannot be created.It is either not available for your operating system or the system needs to be configured in order to support embedded browser


No more handles [MOZILLA_FIVE_HOME='/usr/lib/xulrunner-1.9'] (java.lang.UnsatisfiedLinkError: Could not load SWT library. Reasons: 
    no swt-mozilla-gtk-3650 in java.library.path
    no swt-mozilla-gtk in java.library.path
    Can't load library: /tmp/swtlib-32/libswt-mozilla-gtk-3650.so
    Can't load library: /tmp/swtlib-32/libswt-mozilla-gtk.so
)
org.eclipse.swt.SWTError: No more handles [MOZILLA_FIVE_HOME='/usr/lib/xulrunner-1.9'] (java.lang.UnsatisfiedLinkError: Could not load SWT library. Reasons: 
    no swt-mozilla-gtk-3650 in java.library.path
    no swt-mozilla-gtk in java.library.path
    Can't load library: /tmp/swtlib-32/libswt-mozilla-gtk-3650.so
    Can't load library: /tmp/swtlib-32/libswt-mozilla-gtk.so
)
    at org.eclipse.swt.SWT.error(SWT.java:4109)
    at org.eclipse.swt.browser.Mozilla.initMozilla(Mozilla.java:1703)
    at org.eclipse.swt.browser.Mozilla.create(Mozilla.java:637)
    at org.eclipse.swt.browser.Browser.<init>(Browser.java:119)
    at org.eclipse.ui.internal.browser.BrowserViewer.<init>(BrowserViewer.java:225)
    at org.eclipse.ui.internal.browser.WebBrowserEditor.createPartControl(WebBrowserEditor.java:78)
    at org.eclipse.ui.internal.EditorReference.createPartHelper(EditorReference.java:670)
    at org.eclipse.ui.internal.EditorReference.createPart(EditorReference.java:465)


 

问题的解决方法一:
一、准备工作:1.首先获取一下,相应版本的eclipse的这个插件的源码:org.eclipse.swt.gtk.linux.x86.source
              2.将/usr/lib/pkgconfig/目录下面的libxul.pc 中的
Libs: -L${sdkdir}/sdk/lib -lxpcomglue_s -lxul -lxpcom
改为:Libs: -L${sdkdir}/sdk/lib -lxpcomglue_s -lxul -lxpcom -lxpcomglue
二、编译:进入到源码所在的目录下面
编译时首先确定一下你的jdk的环境变量,执行:echo $JAVA_HOME,
然后将build.sh中的这段代码:
f [ -z "${AWT_LIB_PATH}" ]; then
    if [ -d ${JAVA_HOME}/jre/lib/${AWT_ARCH} ]; then
        AWT_LIB_PATH=${JAVA_HOME}/jre/lib/${AWT_ARCH}
        export AWT_LIB_PATH
    else
        AWT_LIB_PATH=${JAVA_HOME}/jre/bin
        export AWT_LIB_PATH
    fi
Fi
改为:
f [ -z "${AWT_LIB_PATH}" ]; then
    if [ -d ${JAVA_HOME}/jre/lib/mipsel ]; then
        AWT_LIB_PATH=${JAVA_HOME}/jre/lib/mipsel
        export AWT_LIB_PATH
    else
        AWT_LIB_PATH=${JAVA_HOME}/jre/bin
        export AWT_LIB_PATH
    fi
fi
这是因为libjawt.so这个文件是在loongson下的jdk目录下面的${JAVA_HOME}/jre/lib/mipsel在这个目录下面;有了上面的准备工作以后,就可以编译了,执行:./build.sh make_xpcominit  这里面build.sh主要执行make_gnome, make_cairo, make_awt, make_mozilla,make_webkit,并生成相应的.so文件。由于loongson机器上现在是装的firefox,而firefox的内核Gecko不是Webkit,所以即使即使Webkit没能够编译也没问题,另外加的参数make_xpcominit就是生成解决本此Bug的libswt-xpcominit-gtk-xxxx.so文件(其中xxxx代表本次编译的版本号)。

三,替换:编译过以后,将生成一大堆.so的文件,将生成的libswt-xpcominit-gtk-xxxx.so、libswt-xulrunner-gtk-xxxx.so去替换eclipse/plugins/目录下面的org.eclipse.swt.gtk.linux.x86插件的名字相同的.so文件,重启一下eclipse,哈哈,上述的Bug就被轻松的搞定!

问题的解决方法二:
一、准备工作:获取一下,相应版本的eclipse的这个插件的源码:org.eclipse.swt.gtk.linux.x86.source
二、编译:进入到源码所在的目录下面
1.编译时首先确定一下你的jdk的环境变量,执行:echo $JAVA_HOME,
然后将build.sh中的这段代码:
f [ -z "${AWT_LIB_PATH}" ]; then
    if [ -d ${JAVA_HOME}/jre/lib/${AWT_ARCH} ]; then
        AWT_LIB_PATH=${JAVA_HOME}/jre/lib/${AWT_ARCH}
        export AWT_LIB_PATH
    else
        AWT_LIB_PATH=${JAVA_HOME}/jre/bin
        export AWT_LIB_PATH
    fi
Fi
改为:
f [ -z "${AWT_LIB_PATH}" ]; then
    if [ -d ${JAVA_HOME}/jre/lib/mipsel ]; then
        AWT_LIB_PATH=${JAVA_HOME}/jre/lib/mipsel
        export AWT_LIB_PATH
    else
        AWT_LIB_PATH=${JAVA_HOME}/jre/bin
        export AWT_LIB_PATH
    fi
fi
这是因为libjawt.so这个文件是在loongson下的jdk目录下面的${JAVA_HOME}/jre/lib/mipsel在这个目录下面;
2.修改build.sh文件
将make_xulrunner的相应的源码elif [ x`pkg-config —exists libxul && echo YES` = "xYES" ]; then
        XULRUNNER_INCLUDES=`pkg-config --cflags libxul`
        XULRUNNER_LIBS=`pkg-config --libs libxul`
          export XULRUNNER_INCLUDES
          export XULRUNNER_LIBS
         MAKE_MOZILLA=make_xulrunner
改为:elif [ x`pkg-config --exists libxul && echo YES` = "xYES" ]; then
         XULRUNNER_INCLUDES=`pkg-config --cflags libxul`
         XULRUNNER_LIBS=`pkg-config --libs libxul`
        XULRUNNER_INCLUDES=`pkg-config --cflags libxul-unstable`
        XULRUNNER_LIBS="`pkg-config --libs libxul-unstable` -lxpcomglue"
        XULRUNNER_INCLUDES=`pkg-config --cflags libxul`
        XULRUNNER_LIBS="`pkg-config --libs libxul` -lxpcomglue"
          export XULRUNNER_INCLUDES
          export XULRUNNER_LIBS
         MAKE_MOZILLA=make_xulrunner

3.有了上面的准备工作,我们就可以开始我们的源码编译,执行:./build.sh make_xpcominit   这里面build.sh主要执行make_gnome, make_cairo, make_awt, make_mozilla, make_webkit,并生成相应的.so文件。由于loongson机器上现在是装的firefox,而firefox的内核Gecko不是Webkit,所以即使即使Webkit没能够编译也没问题,另外加的参数make_xpcominit就是生成解决本此Bug的libswt-xpcominit-gtk-xxxx.so文件(其中xxxx代表本次编译的版本号)。

三,替换:编译过以后,将生成一大堆.so的文件,将生成的libswt-xpcominit-gtk-xxxx.so、libswt-xulrunner-gtk-xxxx.so去替换eclipse/plugins/目录下面的org.eclipse.swt.gtk.linux.x86插件的名字相同的.so文件,重启一下eclipse,哈哈,上述的Bug就被轻松的搞定!

        实际上上述的编译过程也不是那么简单,一条的命令就能搞定,我中间也走了很多的弯路,刚看上述的Bug并不知道这个是怎么回事,它说不能加载/tmp/swtlib-32/libswt-mozilla-gtk-3650.so,但是tmp文件夹下面之用于存放一些临时的文件,eclipse怎么去这里面找文件呢?对比一下x86机器上和loongson机器上的插件,和internal browser最密切的插件应该是org.eclipse.ui.browser,但是里面除了.class的文件也就是一些配置文件,java代码在loongson上是能跑起来的,所以org.eclipse.ui.browser这个插件应该不会导致eclipse的内置游览器

在loongson下不可用,从名字上看,上述不能加载的.so动态连接库文件应该是和swt相关的,所以就找eclipse中和swt相关的插件,找来找去这个插件org.eclipse.swt.gtk.linux.x86从名字上看swt的相关性最大,比较一下发现,loongson下面的这个插件,少了很多的.so文件,主要包括这几个.so的文件libcairo-swt.so、libswt-mozilla-gtk-xxxx.so、libswt-xpcominit-gtk-xxxx.so文件,至于说为什么会定位到是少libswt-xpcominit-gtk-xxxx.so文件这个文件才报的错误,那就把x86机器上多出来的.so文件一个个删掉,看看eclipse的运行结果,具体的测试结果如下:

     
         
          x  代表加入此文件       √  代表不加入此文件    这里测试结果:”内置游览器不可用“ 即是在loogson机器上报的错误

从上面的测试结果可以看出,第一、有无libcairo-swt.so对于eclipse的内置游览器是没有影响的;

                                             第二、只要加入libswt-xpcominit-gtk-xxxx.so游览器才可用。

类比x86上的测试结果,要想使loogson上eclipse的内置游览器可用,应该至少要编译出libswt-xpcominit-gtk-xxxx.so这个文件。
    由于一直编译不到上述的libswt-xpcominit-gtk-xxxx.so文件,我还曾经尝试的去编译firefox的源码mozilla中的browser和xulrunner,这可不是在一般的机器上编译,这是在loongson下面做,很多基本的库文件也都是没有的,这个过程是相当的崩溃的,现在想想当时的解决思路确实不对,因为当时我想build.sh 有好几个编译选项:make_mozilla、make_xulrunner等,由于编译xulrunner选项所需要的libxul.pc文件是有的,但是编译mozilla选项所需的mozilla-xpcom.pc文件是没有的,我想可能是mozilla选项没有编译,导致生成的.so文件不全,所以我就费很大力气去编译mozilla,希望能够通过编译生成mozilla-xpcom.pc文件,这是一个很费劲的过程!!!!后来经过牛人指点,发现源码org.eclipse.swt.gtk.linux.x86.source下面有一个make_linux.mak文件,知道原来还有一些编译选项需要自己去指定,如上面的make_xpcominit,指定这个以后,我们想要的libswt-xpcominit-gtk-xxxx.so文件被轻松的编译出来,这个搞定了。将生成的.so文件去替换原来eclipse/plugins里面的.so文件应该是没有问题的。

       但是问题又出来了,启动eclipse没有问题,当你打开它的内置游览器,eclipse崩了,新的Bug来了:/opt/java-1.6.0/bin/java: symbol lookup error: /opt/eclipse-3.6.1/configuration/org.eclipse.osgi/bundles/645/1/.cp/libswt-xpcominit-gtk-3655.so: undefined symbol: XPCOMGlueStartup这是什么样的bug,马上都看到希望了,现在看了又被搞蒙了,好事多磨吧,看了eclipse的Bug论坛,说可通过上述两种

方法改libxul.pc和build.sh搞定,后来总结一下:报undefined symbol:XPCOMGlueStartup这个错误,可能是编译时,

少了引入libxpcomglue.so这个动态连接库。

原创粉丝点击