2012-09-27 13 views
5

Actualmente estoy implementando una función de Android con el ndk. declaré la función en java comoObteniendo 'Señal fatal 11 (SIGSEGV) en 0x00000010 (código = 1)' al escribir en la matriz jfloat

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

Entonces, escribí la función 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); 
    } 

Sin embargo, cada vez que intenta llamar a la función con una matriz y un valor consigo el mensaje Logcat :

a/libc (16064): la señal de Fatal 11 (SIGSEGV) en 0x00000010 (código = 1)

af luego de eso, la aplicación falla. Descubrí que siempre ocurre cuando escribo en los valores float. La lectura no conduce a un crash.

¿Hay algún problema? ¿No es posible escribir los valores de la matriz?

Respuesta

3

¡Encontré la solución! Por alguna razón, la función se llamó con un valor nulo como una matriz. Sin embargo, el control rgb == NULL no se activó (no sé por qué motivo). He arreglado el problema mediante la adición de un segundo cheque antes de obtener los valores

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

¡Bien, has encontrado la solución! :) Debes establecer tu respuesta como aceptada para que otras personas puedan encontrar útil esta publicación. –

+0

Lo sé, pero Stackoverflow dice que debería esperar al menos 2 días, por lo que no puedo configurarlo en este momento;) – TSGames

1

Tuve el mismo problema cuando trabajé con el Android NDK, traté de liberar la memoria dentro de la función escrita en C, y terminé obteniendo el error SIGSEGV. El truco que hice fue crear una función en mi código C que manejaba la memoria, y llamé a este método directamente desde Java, después de que terminé con una operación específica en Java. Llamé a la función en C para limpiar la memoria.

+0

Intenté esto, gracias por esta idea. Pero si comento la última línea (ReleaseFloatArrayElements) sigo recibiendo la misma 'Fatal Signal 11'. No funciona para mí por alguna razón. – TSGames

+0

Hm, suena extraño. Intentó comentarlo, esa no sería la solución. Intente hacer una nueva función como esta: 'JNIEXPORT void JNICALL Java_releaseMemory (JNIEnv * env) {(* env) -> ReleaseFloatArrayElements (env, rgb, rgbObject, 0); } 'No es la mejor respuesta ya que no tengo mi código frente a mí. –

0

Tengo la misma medida que problom y finalmente resolverlo.

Creo que el problema es que no tiene init rgbObject en su código java para jni.

acabo de agregar rgbObject = new int [5] en mi código y luego está bien.

también puede hacer lo que dijo TSGames.

Creo que mi es mejor.

Cuestiones relacionadas