C++ XRE_InitEmbedding2 SIGSEGV在带有XULRunner 15的Linux上

C++ XRE_InitEmbedding2 SIGSEGV在带有XULRunner 15的Linux上,c++,linux,gtk,xulrunner,segmentation-fault,C++,Linux,Gtk,Xulrunner,Segmentation Fault,概述: 当使用XULRunner 15调用XRE_InitEmbedding2函数时,我总是在Linux上收到SIGSEGV 详细信息: 我正在尝试将Mozilla(XULRunner 15.05b 64位)浏览器组件嵌入到Fedora 12 64位上的GTK应用程序中。我创建了Eclipse项目,将其配置为使用所有必需的XULRunner库并包含文件,然后成功地构建了它 以下是应用程序代码: #include <iostream> #include <stdlib.h>

概述

当使用XULRunner 15调用XRE_InitEmbedding2函数时,我总是在Linux上收到SIGSEGV

详细信息

我正在尝试将Mozilla(XULRunner 15.05b 64位)浏览器组件嵌入到Fedora 12 64位上的GTK应用程序中。我创建了Eclipse项目,将其配置为使用所有必需的XULRunner库并包含文件,然后成功地构建了它

以下是应用程序代码:

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <gtk/gtk.h>

#include "nsXPCOM.h"
#include "nsXPCOMGlue.h"
#include "nsEmbedString.h"
#include "nsXULAppAPI.h"
#include "nsILocalFile.h"

using namespace std;

XRE_InitEmbedding2Type XRE_InitEmbedding2Delegate;

int main(int argc, char** argv) {

    nsDynamicFunctionLoad kXRESymbols[] = {
        {"XRE_InitEmbedding2", (NSFuncPtr*) &XRE_InitEmbedding2Delegate},
        {0, 0}
    };

    GtkWidget *window;
    gtk_init(&argc, &argv);

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_widget_show(window);

    nsresult rv = XPCOMGlueStartup("/home/Victor/Projects/JavaXPCOM/xulrunner-sdk/bin/libxpcom.so");
    if (NS_FAILED(rv)) {
        return rv;
    }

    rv = XPCOMGlueLoadXULFunctions(kXRESymbols);
    if (NS_FAILED(rv)) {
        return rv;
    }

    nsILocalFile *libXULDir;
    rv = NS_NewNativeLocalFile(nsEmbedCString("/home/Victor/Projects/JavaXPCOM/xulrunner-sdk/bin"), PR_FALSE, &libXULDir);
    if (NS_FAILED(rv)) {
        return rv;
    }

    rv = XRE_InitEmbedding2Delegate(libXULDir, libXULDir, nsnull);
    if (NS_FAILED(rv)) {
        return rv;
    }
    cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
    return 0;
}
当我运行此应用程序时,当使用以下调用堆栈调用XRE_InitEmbedding2Delegate函数时,我会收到SIGSEGV:

Thread [1] 15449 (Suspended : Signal)   
    _dl_fixup() at 0x3dbd60dbec 
    _dl_runtime_resolve() at 0x3dbd614315   
    0x7fffee4031d3  
    0x7fffee429209  
    0x7fffee429223  
    0x7fffee42a943  
    0x7fffee42b7ae  
    0x7fffee42bb25  
    NS_InitXPCOM2_P() at 0x7fffee4063a9 
    XRE_InitEmbedding2() at 0x7fffed998ce7  
    <...more frames...>
线程[1]15449(挂起:信号)
_0x3dbd60dbec处的dl_fixup()
_0x3dbd614315处的dl_运行时_解析()
0x7fffee4031d3
0x7fffee429209
0x7fffee429223
0x7fffee42a943
0x7fffee42b7ae
0x7fffee42bb25
0x7fffee4063a9处的NS_InitXPCOM2_P()
0x7fffed998ce7处的XRE_InitEmbedding2()

有人在Linux平台上用XULRunner 15复制过类似的问题吗?可能我使用了一些错误的命令行参数,或者忘记在命令行中包含某些内容。

这可能与此有关:

自Firefox10以来,我们在创建(构造函数)MozApp对象时发生崩溃。更准确地说,崩溃是通过调用API“XRE_InitEmbedding2()”(其函数- 指针是有效的!)。。。在Firefox第9版之前,我们没有发生过这种崩溃——只是从第10版开始。您可以在以下错误报告中找到详细信息:

您可能可以使用嵌入式API。但是使用gtkmozembed是注定要失败的,因为作者正在撤回对它的所有支持,所以您发现的任何问题都不会得到解决

  • mozilla.dev.embedding中的公告
虽然我发现通过NPAPI运行AdobeFlash插件不稳定,但它经常被用作替代浏览器组件(基于WebKit)。如果您能够接受它的局限性,那么gtkhtml更简单,因此更可靠,并且可能对您更好地工作


最后,对于来到这里寻找解决gtkmozembed在xulrunner中与SIGSEGV崩溃的方法的人(就像我一样),答案可能是你忘了通过
run mozilla.sh运行你的应用程序,这是。

所以你实际上没有使用JavaXPCOM,尽管名称令人困惑,对吧?是的。我只是用这个名字作为项目目录。
Thread [1] 15449 (Suspended : Signal)   
    _dl_fixup() at 0x3dbd60dbec 
    _dl_runtime_resolve() at 0x3dbd614315   
    0x7fffee4031d3  
    0x7fffee429209  
    0x7fffee429223  
    0x7fffee42a943  
    0x7fffee42b7ae  
    0x7fffee42bb25  
    NS_InitXPCOM2_P() at 0x7fffee4063a9 
    XRE_InitEmbedding2() at 0x7fffed998ce7  
    <...more frames...>