2013-01-11 3 views
-2

Je viens de suivre ce article. Et maintenant, j'ai ce code JNI:Android passer tableau 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); 
    } 
} 

Et pour vérifier si c'est ok; J'ai dans le tableau de code Java, la vérification de la longueur de se connecter et son 44 512 tableau encore en retour et n'est pas influencé par la longueur du tableau d'entrée !! Son toujours même, je pense avoir une erreur dans mon Application.mk, parce que construire son OK

App.mk:

APP_ABI := all 
    APP_STL := stlport_static 

et andr.mk sûr:

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 ma question est:

Mon code JNI ne fonctionne pas et je ne sais pas pourquoi, parce que je ne comprends pas dans JNI, et C++!

S'il vous plaît, quelqu'un me dire comment je peux réécrire mon code?

OK ma tâche est:

  • Je voudrais obtenir tableau Java à C++ travail uniquement avec tableau et revenir à tableau Java
+1

trop d'espace blanc et pas assez mise en forme le code. – njzk2

+1

qu'est-ce que ReleaseIntArrayElements est supposé faire avec jfloat *? – njzk2

+0

oh désolé mon erreur –

Répondre

2

Au début, vous ne pouvez pas revenir jfloat * à Java. Vous avez de la chance que ce code ne plante pas JVM. Au deuxième, vous ne pouvez pas utiliser pointeur sur un tableau (je veux dire jfloat *) après que vous appelez ReleaseFloatArrayElements parce que vous retournez ce tableau à JVM et il pourrait déplacer ou même supprimer

MISE À JOUR DE TRAVAIL ACORDING

usally je de cette façon.

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); 
} 
} 

Il est préférable d'utiliser GetArrayRegions/SetArrayRegion becouse lorsque vous utilisez GetFloatArrayElements vous empêchez tableau java originale de se déplacer dans memmory. Dans certains cas, il pourrait causer OutOfMemoryException dans d'autres thtreads s'il y a quelques

PS: Je ne suis pas sûr que je ne l'ai pas manqué quelques crochets, désolé si elle le

+0

Si vous écrivez votre tâche, mai je pourrais écrire le code source correct –

+0

OK ma tâche est: Mon code JNI ne fonctionne pas et je ne sais pas, car je ne comprends pas dans Deep in JNI, et C++, plaide quelqu'un à dire comment je CAnn re-writemy code? –

+0

désolé je pensais que vous pensez question :) donc tâche: OK ma tâche est: je voudrais obtenir tableau Java à c + wokr seulement avec tableau et revenir à tableau Java –