JNI - 如何将jshortArray转换为short *

时间:2011-04-07 18:58:54

标签: java visual-c++ java-native-interface

  

我有一个包含的 dll文件   以下功能:

unsigned char * EncodingData(short Data[], int Length);
     

我想称之为原生方法   在java中。所以我创造了一个    wrapper dll 包含对应的follwing函数   以上功能

JNIEXPORT jcharArray JNICALL Java_com_common_FilterWrapper_EncodingData (JNIEnv * env, jclass cls, jshortArray shortData, jint len)
     

现在我打电话给上面的 JNI   函数来自java,它正在发生   成功召集。

问题:

我想从包装器dll的函数中调用 dll文件的函数,但我不知道如何转换以下内容:

  • jshortArray 指向短[] (将数据传递给 dll文件的功能,预计短[ ] 而不是 jshortArray

  • unsigned char jcharArray (将值返回给java函数)

注意:包装器dll是用VC ++编写的

3 个答案:

答案 0 :(得分:0)

unsigned short tempElem;
jshort* test = env->GetShortArrayElements(shortData, NULL);
int size = (sizeof(test) / sizeof(*test)) - 1;
for (int i = 0; i < size; i++) {
    tempElem = (unsigned short)test[i]);
    printf("[%d] test %u  || size = %d\n", i, tempElem, size);
}

答案 1 :(得分:0)

使用env-> GetShortArrayElements,例如,如果您的jshortArray称为sdata_jshort,则short *指针称为short_data_c_pointer,然后

short_data_c_pointer = env-> GetFloatArrayElements(sdata_jshort,0);

答案 2 :(得分:-1)

JNI documentation

中介绍了这一点

总结:

  

首先,我们提供一组功能   复制原始数组元素   在Java数组的一段和。之间   本机内存缓冲区。使用这些   函数,如果本机方法需要   只能访问少数   大数组中的元素。

     

其次,程序员可以使用另一个   要检索的函数集   固定版本的数组元素。   请记住,这些功能可能会   要求Java VM执行存储   分配和复制。是否这些   函数实际上是复制数组   取决于VM实现