2012-09-30 58 views
0

我对Java非常非常新,但是我决定要用java加载我的C++ dll。让我解释一下我想在Java端做什么。在Java中,我创建了本机函数:GetGLBuffer。参数应该是一个指向ByteArray的指针。 Java虽然没有Pointers,但我有点失落。在C++中,它将等同于:GetGLBuffer(byte * & Buffer); GetGLBuffer(byte * & Buffer); GetGLBuffer(byte * & Buffer);缓冲区从函数内部被填充。当访问DLL时JNI崩溃

在Java中,我做了GetGLBuffer(ByteBuffer Buffer);缓冲区从C++ DLL中填充并发送回Java,以便Java可以在JFrame上绘制它。相反,只要访问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()); 
} 
+0

注意** Buffer.array()**会抛出异常,因为直接ByteBuffer没有一个包裹阵列, –

回答

1

的了Methode的签名不匹配!

使用javah从java类创建一个有效的C++ - 头部签名。

+0

它不匹配:S它给我: ' /* * 类:library_SharedLibrary *方法:GetGLBuffer *签名:(Ljava/NIO /字节缓冲区;)V */ JNIEXPORT空隙JNICALL Java_library_SharedLibrary_GetGLBuffer (JNIEnv的*,JCLASS,jobject);' – Brandon

+0

PLZ更新问题,除去等效部分。 –

+0

恩,好吧有任何转储芯片可用? –