JNI - 使用ByteBuffer参数的本地方法

21

我有一个方法:

public native void doSomething(ByteBuffer in, ByteBuffer out);

由 javah 生成的此方法的 C/C++ 头文件如下:

JNIEXPORT void JNICALL Java__MyClass_doSomething (JNIEnv *, jobject, jobject, jobject, jint, jint);

我如何从 jobject (ByteBuffer实例)中获取数据数组?

1个回答

33

假设您使用ByteBuffer.allocateDirect()分配了ByteBuffer,那么您可以使用GetDirectBufferAddress函数。

jbyte* bbuf_in;  jbyte* bbuf_out;

bbuf_in = (*env)->GetDirectBufferAddress(env, buf1);  
bbuf_out= (*env)->GetDirectBufferAddress(env, buf2); 

1
GetDirectBufferAddress的返回类型是void,你需要将其转换为jbyte: bbuf_in = (jbyte*)(env*)->GetDirectBufferAddress(env, buf1); //C bbuf_in = (jbyte*)env->GetDirectBufferAddress(buf1); //c++ - Error 454
3
这是C语言,你不需要强制转换void* - Michael Mrozek
1
如果你开启了-Wpedantic选项,那么你需要进行强制类型转换。 - James Cape

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接