2

Java代码:

package library;

import java.nio.ByteBuffer;

public class Library
{    
    static{System.loadLibrary("TestDLL");}

    native static void GetGLBuffer(ByteBuffer Buffer, int Width, int Height, int Size);

    public static void main(String[] args) {

        ByteBuffer B = ByteBuffer.allocateDirect(5);
        byte[] C = {'H', 'E', 'R', 'E', '\0'};
        B.put(C);
        GetGLBuffer(B, 0, 0, 4);
        System.out.println((char)B.get(0));
    }
}

C++ 代码:

JNIEXPORT void JNICALL Java_library_Library_GetGLBuffer(JNIEnv *env, jclass cls, jobject buffer, jint Width, jint Height, jint Size)
{
    unsigned char* Buff = (unsigned char*)env->GetDirectBufferAddress(buffer);
    //*Buff = 'A'; Crashes it.
    //Buff[0] = 'A'; Crashes it.
    //std::cout<<Buff[0]; Prints fine but crashes when this function ends.
}

如果我什么都不做,它工作得很好。另外,如果我在上面的函数中声明变量,它会崩溃。

我如何解决它?我做错什么了吗?

它打印出这个文件: http: //pastebin.com/Mz76Bk8G

4

2 回答 2

0

我只想说我解决了。我必须进入我的 JNI 文件夹,将 JDK 7 的 JNI.h 和 JNI_MD.h 复制到我的 C++ 项目文件夹中,将其作为文件包含并使用 .def 文件进行导出。

如果不执行上述所有步骤,它会使 JVM 崩溃。现在我不知道为什么,但我很高兴它有效。我发布这个是为了让其他有同样问题的人解决它。

谢谢大家的意见。很难弄清楚出了什么问题。希望此评论对其他人有所帮助。

于 2012-09-30T20:17:08.693 回答
0

问题是您没有将一个字节数组传递给您的 C 函数,而是一个 ByteBuffer 对象。要在缓冲区内设置值,您需要调用缓冲区对象上的方法,这在 C 中意味着查询对象的类,查询类以获取正确的方法,然后调用该方法。

例如,如果你想在 ByteBuffer 对象上调用 put(int index, byte b) 方法,你需要在你的 C 代码中做这样的事情:

jclass cls = (*env)->GetObjectClass(env, objID);
jmethodId mid = (*env)->GetMethodID(env, cls, "put","(IB)V");
if(mid == 0) return;
(*env)->CallVoidMethod(env, objID, mid, 0, 'A');
于 2012-09-30T20:20:19.183 回答