2011-01-12 626 views
3

如何将unsigned char缓冲区转换为jbyteArray?我需要一个C++缓冲区并通过JNI返回到Java。如何将unsigned char转换为jbyteArray

这是我现在的代码来做到这一点。

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 

Ty。

+1

jbyteArray必须由JVM创建,不能返回普通的C内存位置。这会使JVM崩溃。您还应该使用帮助器方法来设置字节数组的值。 – 2011-01-12 20:41:15

回答

5

these JNI array operations,特别是:

  • NewByteArray
  • GetArrayElements
  • ReleaseArrayElements

如果你知道数组的最大尺寸事先,就可避免NewByteArray电话。

如果您不经常打电话,可能会发现使用JNA更容易。

+0

我解决了它通过创建一个NewByteArray,将内容从unsigned char缓冲区复制到一个jbyte缓冲区,并使用SetArrayByteRegion到数组。这解决了我的问题。这是Android的,我不认为我可以使用JNA。 – 2011-01-12 21:18:28

相关问题