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

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

【问题讨论】:

    标签: android


    【解决方案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++ 代码吗?
    猜你喜欢
    • 1970-01-01
    • 2011-09-08
    • 1970-01-01
    • 2018-02-17
    • 2012-12-26
    • 2014-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多