2011-01-12 275 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

相關問題