如何将无符号字符转换为jbyteArray

4
我该如何将无符号字符缓冲区转换为jbyteArray? 我需要通过JNI获取C ++缓冲区并返回给Java。

这是我目前的代码:

JNIEXPORT jbyteArray JNICALL Java_com_rmsdk_wrapper_RMServices_getImageBuffer(JNIEnv *env, jobject thiso,
    jint w, jint h) {
    emh::PNGSurface * surface = services->getImageBuffer(w,h);
jbyteArray * buffer = (jbyteArray*)malloc(sizeof(jbyteArray)*surface->getBufferSize());
    unsigned char * imgBuff = surface->getBuffer();

    for(int i = 0; i < surface->getBufferSize();i++){
        buffer = imgBuff;
        buffer++;
        imgBuff++;
    }
    return *buffer;
};

我在编译时遇到了以下错误。
Compile++ thumb  : rmsdk <= RMSDK_Wrapper_JNI.cpp
/home/marcos/dev/workspace/rmsdk.native.wraper/jni/RMSDK_Wrapper_JNI.cpp: In function '_jbyteArray* Java_com_rmsdk_wrapper_RMServices_getImageBuffer(JNIEnv*, _jobject*, jint, jint)':
/home/marcos/dev/workspace/rmsdk.native.wraper/jni/RMSDK_Wrapper_JNI.cpp:37: error: cannot convert 'unsigned char*' to '_jbyteArray**' in assignment
make: *** [/home/marcos/dev/workspace/rmsdk.native.wraper/obj/local/armeabi/objs/rmsdk/RMSDK_Wrapper_JNI.o] Error 1

谢谢。

1
jbyteArray必须由JVM创建,不能返回普通的C内存地址。这会导致JVM崩溃。您还应该使用助手方法来设置字节数组的值。 - Peter Lawrey
1个回答

6
请查看这些JNI数组操作,特别是:
  • NewByteArray
  • GetArrayElements
  • ReleaseArrayElements
如果您预先知道数组的最大大小,则可以避免调用NewByteArray。
如果您很少调用此函数,则可能会发现使用JNA更容易。

我通过创建一个NewByteArray,将unsigned char缓冲区中的内容复制到jbyte缓冲区,并使用SetArrayByteRegion方法将其设置到数组中来解决了这个问题。这解决了我的问题。这是针对Android的,我不认为我可以使用JNA。 - Marcos Vasconcelos

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