Lo que podría causar una violación de segmento cuando se llama a NewObjectArray de JNI en Android?

StackOverflow https://stackoverflow.com/questions/2113306

  •  22-09-2019
  •  | 
  •  

Pregunta

Acabo de empezar a trabajar con el NDK de Android, pero me siguen dando SIGSEGV cuando tengo esta llamada en mi código C:

jobjectArray someStringArray;
someStringArray = (*env)->NewObjectArray(env, 10, 
(*env)->FindClass(env,"java/lang/String"),(*env)->NewStringUTF(env, ""));

Base en todo el ejemplo que puedo encontrar, el código anterior es correcta, pero me siguen dando SIGSERGV y todo está bien si la línea NewObjectArray está comentada. Cualquier idea de lo que podría causar un problema?

¿Fue útil?

Solución

que se ve bien, así que supongo que he hecho algo más equivocado. Asumo que está ejecutando con el checkjni? es posible que desee romper que hasta en varias líneas:. hacer lo FindClass y comprobar el valor de retorno, haga lo NewStringUTF y comprobar el valor de retorno, y luego llamar a NewObjectArray

Por cierto, es posible que desee pasar NULL como el argumento final; este patrón de uso de la cadena vacía como el valor predeterminado para cada elemento de la matriz es de uso general (creo que es copiar y pegar de alguna documentación de Sun y se ha extendido desde allí), pero rara vez es útil, y es poco desperdicio. (Y que no coincide con el comportamiento de "nueva String [10]" en Java.)

Otros consejos

Creo que una de las posibles causas es que en un método JNI de largo plazo, la máquina virtual se anula cuando se ejecuta fuera de las ranuras de referencia locales por cada método de invocación (normalmente de 512 ranuras en Android).

funciones

Desde FindClass () y NewStringUTF () asignarían referencias locales, si se queda en un método JNI durante mucho tiempo, la máquina virtual no sé si una referencia local específico debe ser reciclada o no. Por lo que debe llamar explícitamente DeleteLocalRef () para liberar las referencias locales adquiridos cuando no se necesita más. Si no se hace esto, los "zombis" referencias locales ocuparán ranuras de VM, y la máquina virtual aborta durante la ejecución de todas las ranuras de referencia locales.

En el método de corto plazo JNI, esto puede no ser un problema debido a todas las referencias locales serían reciclados al salir de un método JNI.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top