如何将字节数组从android java类传递给JNI C NDK?

Posted

技术标签:

【中文标题】如何将字节数组从android java类传递给JNI C NDK?【英文标题】:How to pass byte array from android java class to JNI C NDK? 【发布时间】:2014-07-09 09:20:28 【问题描述】:

我在 java 类中有字节数组,我想将该字节数组传递给 JNI C 类,我无法在 JNI C 中访问该数组,请帮助。

【问题讨论】:

【参考方案1】:

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

私有原生 void sendData(byte[] data);

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

发送数据(缓冲区);

然后在你的 C 代码中实现这样的函数:

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

读取数组:

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

并发布:

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

上面的代码是C++。要使其适用于 C,您需要将 jni 环境 (env) 作为您正在调用的函数的第一个参数传递,如下所示:

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

【讨论】:

感谢您的出色回答,但我有一个问题,无法解决方法“GetByteArrayElements”,,,如何消除此错误????当我尝试使用 env 方法时,它总是显示给我?? env->ReleaseByteArrayElements(data, cData, JNI_ABORT);也无法解决 如果你使用纯 C,那么你需要 (*env)->GetByteArrayElements(env, array, isCopy)。查看此链接:docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/… 我在 jni.h 中得到了这个方法的引用,但是虽然出现了“GetByteArrayElements”错误 现在我的代码中有这个并且它运行良好:short * cData = (short*)env->GetShortArrayElements(data, &isCopy);查看上面链接中列出的函数,GetByteArrayElements() 也可用。您确定传递给函数的数组是 jbyteArray 吗?您在编写 C 或 C++ 代码吗?

以上是关于如何将字节数组从android java类传递给JNI C NDK?的主要内容,如果未能解决你的问题,请参考以下文章

从 C++ 将字节数组传递给 lua 脚本方法

如何将Mac地址转换为十六进制并将其传递给java中的字节数组

将字节数组从 c++ 传递给 python

如何将字符串从一个类传递到另一个类[重复]

将 C# 3D 数组作为 1D 字节数组传递给 C++ 库

如何将 ArrayList 从 Java 类传递给 jsp