美文网首页
OS系统下JSFML编译与运行

OS系统下JSFML编译与运行

作者: will_7c3c | 来源:发表于2020-03-30 10:26 被阅读0次
    image

    JSFML因各种原因已经停止更新与支持了
    导致其会出现很多难以预料的bug或者是运行错误。

    其中很重要的一点就是,支持OS与linux的版本不是最新版本。
    所以如果你的团队中同时有windows和其他系统参与开发,必须要统一使用低版本的JSFML才能进行开发。


    这是第一点

    第二点是,即使使用了正确的版本,os系统下启动也将是困难的。

    你会遇到各种奇怪的thread错误,导致JVM无法正确搭建。

    Exception in thread "main" org.jsfml.internal.JSFMLError: This thread is not allowed to create a window on this system. If you are running on Mac OS X, you MUST run your application with the -XstartOnFirstThread command line argument!
      at org.jsfml.window.Window.create(Unknown Source)
      at org.jsfml.graphics.RenderWindow.create(Unknown Source)
      at org.jsfml.window.Window.create(Unknown Source)
      at Test.run(Test.java:222)
      at Test.main(Test.java:269)
    

    查阅StackOverflaw发现,是因为涉及到SWT Baser类在os下线程处理出了问题
    必须在搭建JVM运行时加-XstartOnFirstThread参数

    在terminal里代码看起来是这样子的

    javac -cp jsfml.jar:. Test.java
    java -XstartOnFirstThread -cp jsfml:. Test
    

    -cp 参数指classpath linux下分隔符为: 后面的. 是当前路径

    执行结束应该就能跑出来。

    IDEA 里的话,可以在环境中配置运行参数


    image.png

    vm选项添加-XstartOnFirstThread


    image.png

    重申一遍,在jsfml中OS用户遇到任何关于nullponter的exception可能都意味着你无法implement jsfml中的对象实例,而这往往意味着你使用了不支持JSFML的版本

    当你使用了正确的版本库时,如果出现线程错误,则百分之九十可能是因为JSFML继承的SWT在OS平台下线程处理出了问题,需要手动在运行时加-XstartOnFirstThread。

    引申一下,不止是JSFML,涉及到SWT,你都可能会面临这样的问题

    如果你想知道为什么会产生这样的原因,下面是JSFML作者的解释。

    Windows on Mac OS X

    Note that the following information is not only for Mac OS X users, but for anybody who wants their JSFML application to work on a Mac.
    声明:一下内容不止是针对Mac OS X的用户,还包括其他想要让他们的JSFML作品运行在Mac上的开发者
    Our friends at Apple thought of something awesome when designing their window system Cocoa: windows can only be created in an application's main / starting thread. For Java applications, this is bad news, because by default, the JVM runs the main method in a forked thread.
    我们在苹果工作的朋友在设计他们的windows系统Cocoa时有一些很棒的想法,windows只能在应用的主/启动线程里创建。然而对于java应用来说,这不是一个好消息,因为默认设计JVM运行的主类是跑在交叉线程中的。
    To avoid this, you need to pass the JVM option -XstartOnFirstThread to Java when you are starting it.
    为了避免因此产生的其妙问题,我们需要向JVM虚拟机传递一个参数
    -XstartOnFirstThread 当你想要启动他时
    Now, to add some extra fun, this flag will prevent the JVM from starting on any system other than Mac OS X, because it is not a standard flag and thus is not known to other JVM implementations.
    现在,让我们再加一些有趣的东西,这个flag会阻止JVM在其他非Mac OS X 的程序中启动,因为这不是一个标准flag 所以也不会被其他JVM实现
    So, addressing Mac users comes at the cost of providing a special starting script for them. Unfortunately, there's nothing JSFML can do about this.
    所以识别出Mac Users 需要额外提供一些特殊的启动脚本,不幸的是,JSFML对此没有任何办法。

    综上,JAVA是跨平台的应用
    而JSFML却不是
    JSFML对此也没有提供真正的解决办法。

    相关文章

      网友评论

          本文标题:OS系统下JSFML编译与运行

          本文链接:https://www.haomeiwen.com/subject/twumuhtx.html