0

私はJavaに非常に慣れていませんが、C++ dllをJavaにロードすることにしました。Java側で何をしようとしているのか説明させてください..

Java では、ネイティブ関数 GetGLBuffer を作成しています。パラメーターは、ByteArray へのポインターであると想定されています。Javaにはポインターがないので、ちょっと迷っています。

C++ では、GetGLBuffer(byte* &Buffer); と同等です。バッファは関数内からいっぱいになります。

Java では GetGLBuffer(ByteBuffer Buffer); を実行しました。バッファーは C++ DLL から満たされ、Java が JFrame に描画できるように Java に送り返されます。代わりに、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());
}
4

1 に答える 1

1

Methode-Signatures が一致しません!

javah を使用して、Java クラスから有効な C++ ヘッダー署名を作成します。

于 2012-09-30T07:15:03.347 に答える