2012-09-27 1 views
5

Attualmente sto implementando una funzione Android con il ndk. ho dichiarato la funzione in java comeOttenere "Segnale fatale 11 (SIGSEGV) a 0x00000010 (codice = 1)" durante la scrittura nell'array jfloat

public static native void calculate(float[] rgb,float factor); 

Poi, ho scritto la funzione C:

JNIEXPORT void JNICALL Java_<package>_calculate(
     JNIEnv * env, 
     jobject object, 
     jfloatArray rgbObject, 
     jfloat factor){ 
    jfloat* rgb = (*env)->GetFloatArrayElements(env,rgbObject,0); 
    if(rgb==NULL) return; 

    rgb[0]=5; // Test, crash! 

    (*env)->ReleaseFloatArrayElements(env,rgb,rgbObject,0); 
    } 

Tuttavia, ogni volta che provo a chiamare la funzione con un array e un certo valore ottengo il messaggio logcat :

a/libc (16064): segnale irreversibile 11 (SIGSEGV) a 0x00000010 (codice = 1)

af In questo caso, l'app si arresta in modo anomalo. Ho capito che si verifica sempre quando si scrive nei valori float. La lettura non porta a un incidente.

Ho qualcosa che non va? Non è possibile scrivere i valori dell'array?

risposta

3

Ho trovato la soluzione! Per qualche motivo, la funzione è stata chiamata con un valore null come matrice. Tuttavia, il controllo rgb == NULL non è stato attivato (non so per quale motivo). Ho risolto il problema con l'aggiunta di un secondo controllo prima di ottenere i valori

JNIEXPORT void JNICALL Java_<package>_calculate(
     JNIEnv * env, 
     jobject object, 
     jfloatArray rgbObject, 
     jfloat factor){ 
    if(rgbObject==NULL) return; // Check if incomming array is NULL-Pointer 
    jfloat* rgb = (*env)->GetFloatArrayElements(env,rgbObject,0); 
    if(rgb==NULL) return; 

    rgb[0]=5; // Test, crash! 

    (*env)->ReleaseFloatArrayElements(env,rgb,rgbObject,0); 
    } 
+0

Bene hai trovato la soluzione! :) Dovresti impostare la tua risposta come accettata in modo che altre persone possano trovare utile questo post. –

+0

Lo so, ma Stackoverflow dice che dovrei aspettare almeno 2 giorni, quindi non posso impostarlo adesso;) – TSGames

1

Ho avuto lo stesso problema quando ho lavorato con Android NDK, ho provato a rilasciare la memoria all'interno della funzione scritta in C e ho finito per ottenere l'errore SIGSEGV. Il trucco che ho fatto è stato quello di creare una funzione nel mio codice C che gestiva la memoria e chiamato questo metodo direttamente da Java, dopo che avevo finito con un'operazione specifica in Java. Ho chiamato la funzione in C, per pulire la memoria.

+0

Ho provato questo, grazie per questa idea. Ma se commento l'ultima riga (ReleaseFloatArrayElements) continuo a ricevere lo stesso 'Fatal Signal 11'. Non funziona per me per qualche motivo. – TSGames

+0

Hm, suona strano. Hai provato a commentarlo, questa non sarebbe la soluzione. Prova a creare una nuova funzione in questo modo: 'JNIEXPORT void JNICALL Java_releaseMemory (JNIEnv * env) {(* env) -> ReleaseFloatArrayElements (env, rgb, rgbObject, 0); } 'Non è la migliore risposta in quanto non ho il mio codice di fronte a me. –

0

Ho lo stesso problom come voi e, infine, risolverlo.

penso che il problema è che non hai init rgbObject nel tuo codice java per jni.

aggiungo solo rgbObject = new int [5] nel mio codice e quindi è OK.

si può anche fare come detto TSGames.

penso che il mio sia migliore.