JNI崩溃:S

问题描述:

Java代码:JNI崩溃:S

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

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

如果不执行上述所有步骤,就会导致JVM崩溃。现在我不知道为什么,但我很高兴它的工作原理。我发布这个让其他有相同问题的人修复它。

Thanx的意见家伙。很难弄清楚什么是错的。希望此评论有助于其他人。

+0

你不应该复制文件;你应该#从他们已经存在的地方包括他们。您不应该需要带JNI的.def文件。 – EJP

+0

没有.def时不起作用。我不知道为什么。 我得到: 异常线程 “main” java.lang.UnsatisfiedLinkError中:Library.GetGLBuffer;在Library.GetGLBuffer(本机方法) 在Library.main(图书馆V (L 的Java/NIO /字节缓冲区)。 java:21) 现在,如果我使用.def文件,它工作得很好。 – Brandon

问题是你没有传递一个字节数组到你的C函数,而是一个ByteBuffer对象。要在缓冲区中设置值,您需要调用缓冲区对象上的方法,其中C表示查询对象的类,查询类的正确方法,然后调用方法。

例如,如果你想要做调用的put(INT指数,字节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'); 
+0

他正在使用直接字节缓冲区;他正在调用正确的方法来获取直接缓冲区地址;他然后直接使用直接缓冲区地址。他的代码是正确的,应该可以工作。 – EJP

+0

由于我已经对JNI做了任何事情,这绝对是太久了 - 完全忘记了使用直接字节缓冲区。感谢您的更正! –