【问题标题】:jar unable to locate audio filesjar 无法找到音频文件
【发布时间】: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


【解决方案1】:

检查"/res/sound/""dat/maps/" 之间的区别。那是/

更新

从堆栈跟踪看来,应该存在一个共享库。请按照建议做:

可能的解决方案: a) 将 -Djava.library.path 或 -Dorg.lwjgl.librarypath 设置为包含共享库的目录。 b) 将包含共享库的 JAR 添加到类路径中。

【讨论】:

  • 是的,这是真的,但即使我删除了前导斜杠,它也是同样的问题。在 IDE 中运行,但从 jar 运行时崩溃。在后一种情况下,如果我用前导斜杠打开它在两种情况下都会崩溃。
  • 您确定音频文件包含在res/sound 目录下的jar 中吗?你能发布完整的堆栈跟踪吗?
  • 是的,我很确定,如果我使用 7-zip 查看 jar 文件的内部,res/sound 目录确实存在。我已将完整的堆栈跟踪添加到我的答案中。
  • 好的,目录在那里,但是您尝试访问的文件是否也存在于 jar 文件的该目录中?请编辑您的问题并附上堆栈跟踪
  • 是的,所有 wav 文件都在 res/sound 目录中的预期目录中。
【解决方案2】:

原来问题是双重的。首先,我没有在我的 libs 目录中包含必要的 .dll 文件,其次,当我应该使用“.WAV”时,我以扩展名“.wav”结束了文件名。 (捂脸)

【讨论】:

    猜你喜欢
    • 2018-10-29
    • 2019-07-28
    • 2016-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-13
    • 1970-01-01
    相关资源
    最近更新 更多