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对此也没有提供真正的解决办法。
网友评论