Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java LWJGL 3 stbi_从_内存加载_在jar中时不工作_Java_Intellij Idea_Lwjgl - Fatal编程技术网

Java LWJGL 3 stbi_从_内存加载_在jar中时不工作

Java LWJGL 3 stbi_从_内存加载_在jar中时不工作,java,intellij-idea,lwjgl,Java,Intellij Idea,Lwjgl,我正在跟随一本关于LWJGL3的教程书,我尝试制作自己的图像加载代码(该书代码不使用STB库),当项目正常运行时(IntelliJ IDE,直接从构建文件夹运行),它工作得非常好,它将图像从加载到ByteBuffer中,stbi\u load\u from_memory工作正常,但一旦编译并放入jar文件,它就会停止工作,即使图像已成功加载到ByteBuffer中,就好像stbi\u load\u from_memory函数在jar中只返回null一样 守则: public static Byt

我正在跟随一本关于LWJGL3的教程书,我尝试制作自己的图像加载代码(该书代码不使用STB库),当项目正常运行时(IntelliJ IDE,直接从构建文件夹运行),它工作得非常好,它将图像从加载到ByteBuffer中,
stbi\u load\u from_memory
工作正常,但一旦编译并放入jar文件,它就会停止工作,即使图像已成功加载到ByteBuffer中,就好像
stbi\u load\u from_memory
函数在jar中只返回null一样

守则:

public static ByteBuffer loadImage(String fileName, IntBuffer w, 
    IntBuffer h, IntBuffer comp) throws Exception
    {
        ByteBuffer image;
        //the class name is Utils
        InputStream imageFile = 
        Utils.class.getResourceAsStream(fileName); 

        //The image data gets put into the byte array no matter if
        //its a jar or not
        byte[] imageData = new byte[imageFile.available()];
        imageFile.read(imageData);
        ByteBuffer imageBuffer = 
        BufferUtils.createByteBuffer(imageData.length);
        imageBuffer.put(imageData);
        imageBuffer.flip();
        //imageBuffer is the right size and has the right contents            

        //This is where everything fails if its in a jar,
        //image is set to null and the Exception is thrown
        image = stbi_load_from_memory(imageBuffer, w, h, comp, 0);

        if(image == null)
        {
            throw new Exception("Failed to load image: " + fileName);
        }

        return image;
    }
它不能是拼写错误的文件名或追索权路径,因为它正确地将数据加载到数组中,无论它是否是jar

其他信息:

  • Java版本:1.8.0ƒ64位

  • 处理器体系结构:amd64

  • IDE版本(如果出于某种原因需要):IntelliJ 2017.1.4 Ultimate

  • 操作系统:Ubuntu 16.04 LTS 64位

  • 内核:Linux 4.8.0-58-generic amd64

  • LWJGL版本:3.1.2

  • 该项目在Gradle 3.3中完成

  • 如果需要,我会上传和张贴整个源代码的链接


问题可能出在您的
imageFile.available()
中。InputStream的
可用的
方法不是获取流大小的好方法;事实上,你不能得到流的大小,你必须一直读到它结束

您要做的是将
InputStream
转换为字节数组。请看这里如何做到这一点:。 代码的其余部分应该可以。请注意,您需要一个直接ByteBuffer,因此包装字节数组将不起作用,但您已经使用了正确的方法(
BufferUtils.createByteBuffer


如果您仍然有问题,请查看LWJGL中的示例:

问题可能在您的
imageFile.available()
中。InputStream的
可用的
方法不是获取流大小的好方法;事实上,你不能得到流的大小,你必须一直读到它结束

您要做的是将
InputStream
转换为字节数组。请看这里如何做到这一点:。 代码的其余部分应该可以。请注意,您需要一个直接ByteBuffer,因此包装字节数组将不起作用,但您已经使用了正确的方法(
BufferUtils.createByteBuffer


如果您仍然有问题,请查看LWJGL中的示例:

Ok yeah在经过较长时间的调试后发现了问题,显然该死的数组毕竟大小不同(必须将其写入jar和非jar版本的文件中,并检查大小和字节)。很抱歉,迟交的答复是在度假。谢谢,伙计。好的,是的,经过长时间的调试后发现了问题,显然该死的数组毕竟大小不一样(必须将其写入jar和非jar版本的文件中,并检查大小和字节)。很抱歉,迟交的答复是在度假。谢谢你,伙计。