2013-01-11 27 views
-2

我只是遵循這article。現在,我有這個JNI代碼:Android NDK傳遞數組到c

extern "C"{ 
    JNIEXPORT jfloatArray JNICALL Java_com_jp_algi_Corelib_vector 
     (JNIEnv *env, jobject clazz, jfloatArray input){ 
     jfloat* flt1; 
     flt1 = (*env)->GetFloatArrayElements(env, input, NULL); 
     if (flt1 == NULL){ 
      return NULL; /* exception occurred */ 
     } 
     // do stuff to the array 
     (*env)->ReleaseFloatArrayElements(env, input, flt1, 0); 
     return flt1; 
     //delete flt1, v; 
     //env->SetFloatArrayRegion(result, 0, 1, v); 
    } 
} 

並檢查是否可以;我有在Java代碼數組中,長度檢查記錄和它仍然發回44 512陣列,不受輸入數組長度的影響!它還是一樣的,我覺得我有我的Application.mk一些錯誤,因爲打造OK

App.mk

APP_ABI := all 
    APP_STL := stlport_static 

andr.mk肯定的:

LOCAL_PATH := $(TOP_LOCAL_PATH) 
include $(CLEAR_VARS) 
LOCAL_MODULE := com_jp_algi_Corelib 
LOCAL_SRC_FILES := com_jp_algi_Corelib.cpp, kiss_fft.c, kiss_fftr.c 
include $(BUILD_SHARED_LIBRARY) 

OK,我的問題是:

我的JNI代碼不工作,我不知道爲什麼,因爲我不明白在JNI和C++!

請有人告訴我如何重寫我的代碼?

確定我的任務是:

  • 我想獲得Java數組到C++的工作只與陣列,並返回到Java數組
+1

太多的空白,並沒有足夠的格式在代碼。 – njzk2

+1

ReleaseIntArrayElements應該如何處理jfloat *? – njzk2

+0

哦對不起,我的錯誤 –

回答

2

起初,你不能jfloat返回*到Java。幸運的是,這段代碼不會使JVM崩潰。在第二,你不能使用指針數組(我的意思是jfloat *)你叫ReleaseFloatArrayElements後,因爲您返回該數組JVM,它可以移動它,甚至刪除

UPDATE ACORDING任務

Usally我做它以這種方式。

extern "C" { 
JNIEXPORT jboolean JNICALL Java_com_jp_algi_Corelib_vector 
    (JNIEnv *env, jobject clazz, jfloatArray input){ 
    jfloat* flt1 = NULL; 
    jsize size = env->GetArrayLength(input); 
    // check if array size >0 and wedont cause exception 
    if(size<=0) return(JNI_FALSE); 
    if(env->ExceptionCheck()) { 
#ifndef NDEBUG 
     env->ExceptionDescribe(); 
#endif 
     env->ExceptionClear(); 
     return(JNI_FALSE); 
    } 
    // allocate buffer for array and get data from Java array 
    flt1 = new jfloat[size]; 
    env->GetFloatArrayRegion(input,0,size,flt1); 
    // exception check. Always use exception check 
    if(env->ExceptionCheck()) { 
#ifndef NDEBUG 
     env->ExceptionDescribe(); 
#endif 
     env->ExceptionClear(); 
     delete[] flt1; 
     return(JNI_FALSE); 
    } 
    // do stuff to the array 
    // set result to Java array and delete buffer. And exception check of course 
    env->SetFloatArrayRegion(input,0,size,flt1); 
    delete[] flt1; 
    if(env->ExceptionCheck()) { 
#ifndef NDEBUG 
     env->ExceptionDescribe(); 
#endif 
     env->ExceptionClear(); 
     return(JNI_FALSE); 
    } 
    // All is ok 
    return(JNI_TRUE); 
} 
} 

這是更好becouse當您使用GetFloatArrayElements可以防止原始的Java數組從memmory移動使用GetArrayRegions/SetArrayRegion。在某些情況下,它可能會導致OutOfMemoryException異常其他thtreads如果有一些

PS:我不知道,我沒有錯過一些括號,對不起,如果這樣

+0

如果你寫你的任務,可能是我能寫正確的源代碼 –

+0

確定我的任務就是:我的JNI代碼不工作,我不爲什麼,becouse我不明白,在JNI深,和c + +,請求有人告訴我如何CAn重寫我的代碼? –

+0

對不起,我想你想的問題:)這樣的任務:確定我的任務就是:我想獲得Java數組到c + wokr只有陣列,並返回到Java數組 –