Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.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
JNI在访问DLL时崩溃 我对java非常非常新近,但我决定我要用java加载C++的DLL。让我解释一下我在Java方面想做什么_Java_C++_Java Native Interface_Jnienv - Fatal编程技术网

JNI在访问DLL时崩溃 我对java非常非常新近,但我决定我要用java加载C++的DLL。让我解释一下我在Java方面想做什么

JNI在访问DLL时崩溃 我对java非常非常新近,但我决定我要用java加载C++的DLL。让我解释一下我在Java方面想做什么,java,c++,java-native-interface,jnienv,Java,C++,Java Native Interface,Jnienv,在Java中,我正在创建本机函数:GetGLBuffer。这些参数应该是指向ByteArray的指针。Java没有指针,所以我有点迷路了 在C++中,它等价于:GetGLBuffer(字节*&缓冲区);缓冲区从函数中填充 在Java中,我做了GetGLBuffer(bytebufferbuffer);缓冲区从C++ DLL中填充并返回到java,以便java可以在JFrice上绘制它。相反,它一访问DLL就会崩溃。有人愿意解释我做错了什么吗 package library; import ja

在Java中,我正在创建本机函数:GetGLBuffer。这些参数应该是指向ByteArray的指针。Java没有指针,所以我有点迷路了

在C++中,它等价于:GetGLBuffer(字节*&缓冲区);缓冲区从函数中填充

在Java中,我做了GetGLBuffer(bytebufferbuffer);缓冲区从C++ DLL中填充并返回到java,以便java可以在JFrice上绘制它。相反,它一访问DLL就会崩溃。有人愿意解释我做错了什么吗

package library;

import java.io.IOException;
import java.nio.ByteBuffer;

class SharedLibrary {

    static{System.loadLibrary("TestDLL");}

    static native void GetGLBuffer(ByteBuffer Buffer);

    public SharedLibrary() throws IOException {
        int BitsPerPixel = 32, Width = 765, Height = 565;
        int IntSize = ((Width * BitsPerPixel + 31) / 32) * Height;
        int ByteSize = IntSize * 4;

        ByteBuffer Buffer = ByteBuffer.allocateDirect(ByteSize);
        GetGLBuffer(Buffer);
        Frame F = new Frame("Testing Buffer", Buffer.array());  //Draw The Image on a frame.
    }
}

C++方面:

JNIEXPORT void JNICALL Java_library_SharedLibrary_GetGLBuffer(JNIEnv *env, jclass cl, jobject buffer)
{
    int Bpp = 32;

    Bitmap Foo("C:/Users/Brandon/Desktop/Untitled.bmp");
    std::vector<RGB> Pixels = Foo.Foo();

    std::vector<unsigned char> TEMP(Foo.Size());
    unsigned char* BuffPos = &TEMP[0];

    for (int I = 0; I < Foo.Height(); ++I)
    {
        for (int J = 0; J < Foo.Width(); ++J)
        {
            *(BuffPos++) = Pixels[(Foo.Height() - 1 - I) * Foo.Width() + J].RGBA.B;
            *(BuffPos++) = Pixels[(Foo.Height() - 1 - I) * Foo.Width() + J].RGBA.G;
            *(BuffPos++) = Pixels[(Foo.Height() - 1 - I) * Foo.Width() + J].RGBA.R;

            if (Bpp > 24)
                *(BuffPos++) = Pixels[(Foo.Height() - 1 - I) * Foo.Width() + J].RGBA.A;
        }
        if(Bpp == 24)
            BuffPos += Foo.Width() % 4;
    }


    jbyte *data = (jbyte*)env->GetDirectBufferAddress(buffer);    //Crashes as soon as it hits this.. If commented out, I have no problem.
    MessageBox(NULL, "", "", 0);
    memcpy(data, TEMP.data(), Foo.Size());
}
JNIEXPORT void JNICALL Java\u library\u SharedLibrary\u GetGLBuffer(JNIEnv*env,jclass cl,jobject buffer)
{
int-Bpp=32;
位图Foo(“C:/Users/Brandon/Desktop/Untitled.bmp”);
std::vector Pixels=Foo.Foo();
向量温度(Foo.Size());
无符号字符*BuffPos=&TEMP[0];
对于(int I=0;I24)
*(BuffPos++)=像素[(Foo.Height()-1-I)*Foo.Width()+J].RGBA.A;
}
如果(Bpp==24)
BuffPos+=Foo.Width()%4;
}
jbyte*data=(jbyte*)env->GetDirectBufferAddress(buffer);//一旦遇到这个问题就会崩溃..如果注释掉,我没有问题。
消息框(空,“”,“”,0);
memcpy(data,TEMP.data(),Foo.Size());
}

Methode签名不匹配


使用javah从java类创建有效的c++头签名。

它确实匹配:S它给我:`/**class:library\u SharedLibrary*方法:GetGLBuffer*签名:(Ljava/nio/ByteBuffer;)V*/JNIEXPORT void JNICALL java\u library\u SharedLibrary\u GetGLBuffer(JNIEnv*,jclass,jobject)`嗯,好的,有可用的转储文件吗?请注意,Buffer.array()将引发异常,因为direct ByteBuffer没有包装数组,