【问题标题】:JNI: How to get jbyteArray sizeJNI:如何获取 jbyteArray 大小
【发布时间】:2011-06-07 08:28:47
【问题描述】:

背景

我在 JNI 中使用字节数组。而且我无法获得 jbyteArraylength。我正在 Windows 7 中的 eclipse 中编写代码。

Java 代码:

private native int Enroll( byte[] pSeed );

JNI 代码:

在 JNI 中,我有一个结构,它有两个成员 unsigned long lengthunsigned char data[1]

typedef struct blobData_s {
    unsigned long     length;
    unsigned char     data[1];
} blobData_t;

现在,当我的 JNI 函数作为参数 jbyteArray jpSeed 获取时,我想获取 jpSeed 的长度并将其设置为结构的长度成员。

JNIEXPORT jint JNICALL Java_com_Test_Enroll( JNIEnv* env, jobject thiz, jbyteArray jpSeed ){
     blobData_t* bd = malloc( sizeof(blobData_t) );
     bd->length = **Question 1**
     bd->data[1] = jbyteArray;
}

问题 1:如何在 JNI 中获取 jpSeed 的长度?

问题 2:此代码是否可以正常工作 bd.data[1] = jbyteArray;

【问题讨论】:

    标签: android arrays eclipse size java-native-interface


    【解决方案1】:
    1. 您可以使用GetArrayLength(JNIEnv* env, jbyteArray array) 阅读 here

    2. 不确定你想做什么,我假设你想要bd.data[1] 中的jpSeed 的内容。 无论如何,访问字节数组的内容,应该使用GetByteArrayElements(...).

    【讨论】:

      【解决方案2】:

      解决方案

      回答问题 1。 因为 jpSeedjbyteArray 这意味着您可以通过调用在 JNI 中声明的 GetByteArrayElements( ... ) 函数来获取它的长度(您可以阅读文档here)这里正确的代码是:

      JNIEXPORT jint JNICALL Java_com_Test_Enroll( JNIEnv* env, jobject thiz, jbyteArray jpSeed ){
           blobData_t* bd = malloc( sizeof(blobData_t) );
           bd->length = (*env)->GetArrayLength( env, jpSeed );
           .......
      }
      

      回答问题 2。 这个bd->data[1] = jbyteArray; 代码不正确,因为它不会被编译,这部分的正确解决方案是:

      JNIEXPORT jint JNICALL Java_com_Test_Enroll( JNIEnv* env, jobject thiz, jbyteArray jpSeed ){
           blobData_t* bd = malloc( sizeof(blobData_t) );
           .......
           jbyte* bytes = (*env)->GetByteArrayElements( env, jpSeed, 0 );
           bd->data[1] = bytes[1];
      }
      

      别忘了释放。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-16
        • 1970-01-01
        • 2013-11-11
        • 1970-01-01
        • 1970-01-01
        • 2019-12-01
        • 2013-12-22
        相关资源
        最近更新 更多