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
答案 0 :(得分:0)
我只想说我解决了它。我必须进入我的JNI文件夹,将JNI.h和JDK 7的JNI_MD.h复制到我的C ++项目文件夹,将其作为文件包含,并使用.def文件导出。
如果不执行上述所有步骤,则会导致JVM崩溃。现在我不知道为什么,但我很高兴它有效。我发布这个是为了让其他有相同问题的人解决它。
Thanx对于观点人物。很难弄清楚出了什么问题。希望这条评论有助于其他人。
答案 1 :(得分: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');