Сбои JNI при доступе к DLL

Я очень, очень плохо знаком с Java, но решил, что хочу загрузить свою C ++ dll в java. Позвольте мне объяснить, что я пытаюсь сделать на стороне Java ..

В Java я создаю нативную функцию: GetGLBuffer. Параметры должны быть указателями на ByteArray. Ява не имеет указателей, поэтому я немного потерян.

В C ++ это будет эквивалентно: GetGLBuffer (byte * &Буфер); Буфер заполняется изнутри функции.

В 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

Решение

Методы-подписи не совпадают!

Используйте javah для создания правильной подписи заголовка c ++ из класса java.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]