如何将Android Java类中的字节数组传递到JNI C NDK?

10

我有一个Java类中的字节数组,我想将该字节数组传递给JNI C类。但我无法在JNI C中访问该数组,请帮忙解决。

1个回答

20

您需要像这样在Java中声明接收数组的JNI函数:

private native void sendData(byte[] data);

您可以像调用其他函数一样调用该函数:

sendData(buffer);

然后在C代码中实现该功能,像这样:

JNIEXPORT void JNICALL Java_com_packageXXX_yourClass_sendData(JNIEnv* env, jobject thiz, jbyteArray data);

读取数组:

byte * cData = env->GetByteArrayElements(data, &isCopy);

并释放:

env->ReleaseByteArrayElements(data, cData, JNI_ABORT);

上述代码是C++。若要让其在C中工作,您需要将jni环境(env)作为您要调用的函数的第一个参数传递,像这样:

(*env)->GetByteArrayElements(env,...)


谢谢你的出色回答,但我有一个问题,方法'GetByteArrayElements'无法解决,如何消除这个错误?当我尝试使用环境方法时,它总是向我显示。 - Deepak
如果您使用的是纯C,则需要使用(*env)->GetByteArrayElements(env, array, isCopy)。请查看此链接:http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html。 - Traian
我在jni.h中获取了该方法的引用,但是出现了“GetByteArrayElements”错误。 - Deepak
现在我的代码中有这个,它完美地工作:short * cData = (short*)env->GetShortArrayElements(data, &isCopy); 从上面链接列出的函数来看,GetByteArrayElements()也是可用的。你确定传递给函数的数组是jbyteArray吗?你是在写C还是C++代码? - Traian
jboolean isCopy; rgba8888* surface_buffer = (rgba8888*) malloc(4); jbyte* cData = (*env)->GetByteArrayElements(env, buffer, &isCopy); jsize length = (*env)->GetArrayLength(env, buffer); - Deepak
显示剩余3条评论

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