【发布时间】:2017-02-13 17:02:25
【问题描述】:
所以我正在用 Java 编写一个必须能够播放 wav 文件的程序。从 Intellij 中运行时它可以完美运行,但是当我从 jar 中运行它时,它会在尝试检索声音文件并返回此错误时立即崩溃:
Unable to create from inputstream, Stream closed
Exception in thread "main" java.lang.NullPointerException
这是我用来检索声音文件的代码:
protected int loadSound(String file) {
int data = AL10.alGenBuffers(); //Create new buffer object
buffers.add(data); //Store buffer ID in array list
ClassLoader loader = Thread.currentThread().getContextClassLoader();
InputStream filePath = loader.getResourceAsStream("/res/sound/" + file);
WaveData wavFile = WaveData.create(new BufferedInputStream(filePath)); //Retrieve wav file
AL10.alBufferData(data, wavFile.format, wavFile.data, wavFile.samplerate); //Store wav file data and properties in buffer object
wavFile.dispose(); //Discard wav file from stored memory
return data; //Return buffer ID
}
我不明白为什么从 jar 运行时这不起作用,因为当我查看 jar 文件时,我可以看到 res 文件夹确实在其中。更奇怪的是,我在程序的另一部分使用或多或少相同的代码来检索文本文件,并且能够确认在 IDE 和 jar 中运行时它是否正常工作。该代码如下:
ClassLoader loader = Thread.currentThread().getContextClassLoader();
InputStream mapPath = loader.getResourceAsStream("dat/maps/" + mapName);
我知道类似的问题以前在这里被问过很多次,但我找到的解决方案都没有成功。我很确定这与未正确打包的文件有关,但我不能说应该怎么做。
这是完整的堆栈跟踪:
C:\Users\Jack>java -jar C:\Users\Jack\IdeaProjects\ProjectBlackSpace\out\artifacts\ProjectBlackSpace_jar\ProjectBlackSpace.jar
OpenALC10: true
OpenALC11: true
caps.ALC_EXT_EFX = true
Num HRTF specifiers = 2: true
Sample rate: default-44100
HRTF enabled: true
HRTF state: 0x3
OpenGL version: 4.5.0 NVIDIA 368.81
[LWJGL] Failed to load a library. Possible solutions:
a) Set -Djava.library.path or -Dorg.lwjgl.librarypath to the directory that contains the shared libraries.
b) Add the JAR(s) containing the shared libraries to the classpath.
[LWJGL] Enable debug mode with -Dorg.lwjgl.util.Debug=true for better diagnostics.
Unable to create from inputstream, Stream closed
Exception in thread "main" java.lang.NullPointerException
at projectBlackSpaceApp.Sounds.loadSound(Sounds.java:22)
at projectBlackSpaceApp.Player.init(Player.java:94)
at projectBlackSpaceApp.Game.init(Game.java:72)
at projectBlackSpaceApp.Main.run(Main.java:159)
at projectBlackSpaceApp.Main.init(Main.java:82)
at projectBlackSpaceApp.Main.main(Main.java:195)
AL lib: (EE) alc_cleanup: 1 device not closed
使用-Dorg.lwjgl.util.Debug=true 运行程序时,从命令行运行时的结果没有什么不同,但是从 IDE 中运行时,它会提供更多信息:
[LWJGL] Version: 3.0.0 build 90
[LWJGL] OS: Windows 10 v10.0
[LWJGL] JRE: 1.8.0_60 amd64
[LWJGL] JVM: Java HotSpot(TM) 64-Bit Server VM v25.60-b23 by Oracle Corporation
[LWJGL] Loading library (system): lwjgl
[LWJGL] Loaded from java.library.path: libs\lwjgl.dll
[LWJGL] MemoryUtil accessor: MemoryAccessorUnsafe
[LWJGL] Loading library: OpenAL
[LWJGL] ThreadLocalUtil state: UnsafeState
[LWJGL] Loaded from java.library.path: libs\OpenAL.dll
OpenALC10: true
OpenALC11: true
caps.ALC_EXT_EFX = true
Num HRTF specifiers = 2: true
Sample rate: default-44100
HRTF enabled: true
HRTF state: 0x3
[LWJGL] Loading library: glfw
[LWJGL] Loaded from java.library.path: libs\glfw.dll
[LWJGL] Loading library: opengl32
[LWJGL] opengl32.dll not found in java.library.path=libs/
[LWJGL] Loaded from system paths
OpenGL version: 4.5.0 NVIDIA 368.81
[LWJGL] Loading library: jemalloc
[LWJGL] jemalloc.dll not found in java.library.path=libs/
[LWJGL] jemalloc.dll not found in system paths
[LWJGL] Using SharedLibraryLoader...
java.lang.RuntimeException: Failed to extract jemalloc library
at org.lwjgl.system.SharedLibraryLoader.load(SharedLibraryLoader.java:65)
at org.lwjgl.system.Library.loadNative(Library.java:139)
at org.lwjgl.system.jemalloc.JEmalloc.<clinit>(JEmalloc.java:37)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at org.lwjgl.system.MemoryManage.getInstance(MemoryManage.java:36)
at org.lwjgl.system.MemoryUtil$LazyInit.<clinit>(MemoryUtil.java:76)
at org.lwjgl.system.MemoryUtil.nmemAlloc(MemoryUtil.java:162)
at org.lwjgl.system.MemoryUtil.memAlloc(MemoryUtil.java:180)
at org.lwjgl.system.MemoryUtil.memUTF8(MemoryUtil.java:1530)
at org.lwjgl.system.APIUtil.apiArrayi(APIUtil.java:430)
at org.lwjgl.opengl.GL20.glShaderSource(GL20.java:425)
at projectBlackSpaceApp.Shaders.init(Shaders.java:29)
at projectBlackSpaceApp.Main.run(Main.java:123)
at projectBlackSpaceApp.Main.init(Main.java:82)
at projectBlackSpaceApp.Main.main(Main.java:195)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
Caused by: java.lang.RuntimeException: Failed to locate resource: jemalloc.dll
at org.lwjgl.system.SharedLibraryLoader.extractFile(SharedLibraryLoader.java:80)
at org.lwjgl.system.SharedLibraryLoader.load(SharedLibraryLoader.java:63)
... 20 more
[LWJGL] Failed to load a library. Possible solutions:
a) Set -Djava.library.path or -Dorg.lwjgl.librarypath to the directory that contains the shared libraries.
b) Add the JAR(s) containing the shared libraries to the classpath.
java.lang.UnsatisfiedLinkError: Failed to locate library: jemalloc.dll
at org.lwjgl.system.Library.loadNativeRelative(Library.java:177)
at org.lwjgl.system.Library.loadNative(Library.java:134)
at org.lwjgl.system.jemalloc.JEmalloc.<clinit>(JEmalloc.java:37)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at org.lwjgl.system.MemoryManage.getInstance(MemoryManage.java:36)
at org.lwjgl.system.MemoryUtil$LazyInit.<clinit>(MemoryUtil.java:76)
at org.lwjgl.system.MemoryUtil.nmemAlloc(MemoryUtil.java:162)
at org.lwjgl.system.MemoryUtil.memAlloc(MemoryUtil.java:180)
at org.lwjgl.system.MemoryUtil.memUTF8(MemoryUtil.java:1530)
at org.lwjgl.system.APIUtil.apiArrayi(APIUtil.java:430)
at org.lwjgl.opengl.GL20.glShaderSource(GL20.java:425)
at projectBlackSpaceApp.Shaders.init(Shaders.java:29)
at projectBlackSpaceApp.Main.run(Main.java:123)
at projectBlackSpaceApp.Main.init(Main.java:82)
at projectBlackSpaceApp.Main.main(Main.java:195)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
[LWJGL] [MemoryAllocator] Failed to load the jemalloc library.
[LWJGL] MemoryUtil allocator: StdlibAllocator
将jemalloc.dll 添加到库目录确实会阻止运行时异常的发生,但它似乎没有任何其他效果或好或坏。
任何帮助将不胜感激。
【问题讨论】:
-
Adding the jemalloc.dll to the library directory does stop the runtime exception from happening, but it doesn't seem to have any other effect for better or worse.什么意思???堆栈跟踪中没有错误但没有音频出现? -
是的,这两件事。
-
哦,但我应该提一下,当程序尝试检索第一个声音时,我仍然收到
Unable to create from inputstream, Stream closed Exception in thread "main" java.lang.NullPointerException错误。
标签: java audio intellij-idea jar lwjgl