Android: Proceso nativo provoca el desbordamiento de ReferenceTable después de un tiempo (android-ndk)

Usando el ndk he compilado un código escrito en C. El programa es una conversión de archivos formato ecm, aquí el código nativo: enlace . He elegido hacer con JNI por razones de optimización, porque el programa requiere una gran cantidad de procesamiento de la CPU.

Los archivos a convertir pueden ser muy grandes, entre 200mb y 700mb. Todo funciona perfectamente, pero al intentar convertir archivos de más de 600Mb, cerca del final del proceso de conversión, la aplicación se detiene con el siguiente mensaje de error:

11-13 20:24:36.775: WARN/dalvikvm(1468): ReferenceTable overflow (max=512) 11-13 20:24:36.775: WARN/dalvikvm(1468): Last 10 entries in JNI local reference table: 11-13 20:24:36.775: WARN/dalvikvm(1468): 502: 0x465117b0 cls=Ljava/lang/Class; 'Lunecm4droid/kiio/es/mainUECM;' (164 bytes) 11-13 20:24:36.775: WARN/dalvikvm(1468): 503: 0x465117b0 cls=Ljava/lang/Class; 'Lunecm4droid/kiio/es/mainUECM;' (164 bytes) 11-13 20:24:36.775: WARN/dalvikvm(1468): 504: 0x465117b0 cls=Ljava/lang/Class; 'Lunecm4droid/kiio/es/mainUECM;' (164 bytes) 11-13 20:24:36.775: WARN/dalvikvm(1468): 505: 0x465117b0 cls=Ljava/lang/Class; 'Lunecm4droid/kiio/es/mainUECM;' (164 bytes) 11-13 20:24:36.775: WARN/dalvikvm(1468): 506: 0x465117b0 cls=Ljava/lang/Class; 'Lunecm4droid/kiio/es/mainUECM;' (164 bytes) 11-13 20:24:36.775: WARN/dalvikvm(1468): 507: 0x465117b0 cls=Ljava/lang/Class; 'Lunecm4droid/kiio/es/mainUECM;' (164 bytes) 11-13 20:24:36.775: WARN/dalvikvm(1468): 508: 0x465117b0 cls=Ljava/lang/Class; 'Lunecm4droid/kiio/es/mainUECM;' (164 bytes) 11-13 20:24:36.786: WARN/dalvikvm(1468): 509: 0x465117b0 cls=Ljava/lang/Class; 'Lunecm4droid/kiio/es/mainUECM;' (164 bytes) 11-13 20:24:36.786: WARN/dalvikvm(1468): 510: 0x465117b0 cls=Ljava/lang/Class; 'Lunecm4droid/kiio/es/mainUECM;' (164 bytes) 11-13 20:24:36.786: WARN/dalvikvm(1468): 511: 0x465117b0 cls=Ljava/lang/Class; 'Lunecm4droid/kiio/es/mainUECM;' (164 bytes) 11-13 20:24:36.786: WARN/dalvikvm(1468): JNI local reference table summary (512 entries): 11-13 20:24:36.786: WARN/dalvikvm(1468): 512 of Ljava/lang/Class; 164B (1 unique) 11-13 20:24:36.786: WARN/dalvikvm(1468): Memory held directly by tracked refs is 164 bytes 11-13 20:24:36.786: ERROR/dalvikvm(1468): Failed adding to JNI local ref table (has 512 entries) 11-13 20:24:36.786: INFO/dalvikvm(1468): "Thread-9" prio=5 tid=8 RUNNABLE 11-13 20:24:36.786: INFO/dalvikvm(1468): | group="main" sCount=0 dsCount=0 s=N obj=0x46523c48 self=0x30e960 11-13 20:24:36.786: INFO/dalvikvm(1468): | sysTid=1506 nice=0 sched=0/0 cgrp=default handle=2542616 11-13 20:24:36.786: INFO/dalvikvm(1468): | schedstat=( 200042694099 61087921121 333928 ) 11-13 20:24:36.786: INFO/dalvikvm(1468): at unecm4droid.kiio.es.mainUECM.invokeNativeFunction(Native Method) 11-13 20:24:36.786: INFO/dalvikvm(1468): at unecm4droid.kiio.es.mainUECM.access$10(mainUECM.java:490) 11-13 20:24:36.786: INFO/dalvikvm(1468): at unecm4droid.kiio.es.mainUECM$11.run(mainUECM.java:735) 11-13 20:24:36.786: ERROR/dalvikvm(1468): VM aborting 11-13 20:24:36.795: INFO/DEBUG(121): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** 11-13 20:24:36.795: INFO/DEBUG(121): Build fingerprint: 'google/passion/passion/mahimahi:2.2/FRF91/43546:user/release-keys' 11-13 20:24:36.795: INFO/DEBUG(121): pid: 1468, tid: 1506 >>> unecm4droid.kiio.es <<< 11-13 20:24:36.795: INFO/DEBUG(121): signal 11 (SIGSEGV), fault addr deadd00d 11-13 20:24:36.795: INFO/DEBUG(121): r0 00000026 r1 afd14699 r2 afd14699 r3 00000000 11-13 20:24:36.795: INFO/DEBUG(121): r4 802a3448 r5 802a3448 r6 0030e960 r7 0030e9b0 11-13 20:24:36.795: INFO/DEBUG(121): r8 464c9b48 r9 43277fa4 10 43277f8c fp 464c9ed8 11-13 20:24:36.795: INFO/DEBUG(121): ip deadd00d sp 464c9130 lr afd16155 pc 802424e0 cpsr 20000030 11-13 20:24:36.795: INFO/DEBUG(121): d0 643a64696f72646e d1 6472656767756265 11-13 20:24:36.795: INFO/DEBUG(121): d2 465117b046511767 d3 465117b04651170a 11-13 20:24:36.795: INFO/DEBUG(121): d4 465117b0465117b0 d5 465117b0465117b0 11-13 20:24:36.795: INFO/DEBUG(121): d6 465117b0465117b0 d7 465117b0465117b0 11-13 20:24:36.795: INFO/DEBUG(121): d8 4198000041b80000 d9 43e0000000000000 11-13 20:24:36.795: INFO/DEBUG(121): d10 41dfffffffc00000 d11 c3e0000000000000 11-13 20:24:36.795: INFO/DEBUG(121): d12 0000000000000000 d13 0000000000000000 11-13 20:24:36.795: INFO/DEBUG(121): d14 0000000000000000 d15 0000000000000000 11-13 20:24:36.795: INFO/DEBUG(121): d16 47d7202800000000 d17 c083180000000000 11-13 20:24:36.795: INFO/DEBUG(121): d18 4035000000000000 d19 0000000000000000 11-13 20:24:36.795: INFO/DEBUG(121): d20 3ff0000000000000 d21 8000000000000000 11-13 20:24:36.795: INFO/DEBUG(121): d22 c035000000000000 d23 ff00080008000700 11-13 20:24:36.795: INFO/DEBUG(121): d24 ff00080008000700 d25 ff00080008000700 11-13 20:24:36.795: INFO/DEBUG(121): d26 0100010001000100 d27 0100010001000100 11-13 20:24:36.795: INFO/DEBUG(121): d28 0100010001000100 d29 3ff0000000000000 11-13 20:24:36.795: INFO/DEBUG(121): d30 0000000000000000 d31 3ff0000000000000 11-13 20:24:36.795: INFO/DEBUG(121): scr 80000012 11-13 20:24:36.865: INFO/DEBUG(121): #00 pc 000424e0 /system/lib/libdvm.so 11-13 20:24:36.865: INFO/DEBUG(121): #01 pc 0004655e /system/lib/libdvm.so 11-13 20:24:36.865: INFO/DEBUG(121): #02 pc 000466f0 /system/lib/libdvm.so 11-13 20:24:36.865: INFO/DEBUG(121): #03 pc 00001110 /data/data/unecm4droid.kiio.es/lib/libndkfoo.so 11-13 20:24:36.865: INFO/DEBUG(121): #04 pc 000016da /data/data/unecm4droid.kiio.es/lib/libndkfoo.so 11-13 20:24:36.865: INFO/DEBUG(121): #05 pc 00001bda /data/data/unecm4droid.kiio.es/lib/libndkfoo.so 11-13 20:24:36.865: INFO/DEBUG(121): #06 pc 00001f2e /data/data/unecm4droid.kiio.es/lib/libndkfoo.so 11-13 20:24:36.865: INFO/DEBUG(121): #07 pc 00017034 /system/lib/libdvm.so 11-13 20:24:36.865: INFO/DEBUG(121): #08 pc 00045744 /system/lib/libdvm.so 11-13 20:24:36.865: INFO/DEBUG(121): #09 pc 0004ae8e /system/lib/libdvm.so 11-13 20:24:36.865: INFO/DEBUG(121): #10 pc 0001bf98 /system/lib/libdvm.so 11-13 20:24:36.865: INFO/DEBUG(121): #11 pc 00022bc4 /system/lib/libdvm.so 11-13 20:24:36.865: INFO/DEBUG(121): #12 pc 00021a60 /system/lib/libdvm.so 11-13 20:24:36.865: INFO/DEBUG(121): #13 pc 0005cf60 /system/lib/libdvm.so 11-13 20:24:36.865: INFO/DEBUG(121): #14 pc 0005d190 /system/lib/libdvm.so 11-13 20:24:36.876: INFO/DEBUG(121): #15 pc 000500d0 /system/lib/libdvm.so 11-13 20:24:36.876: INFO/DEBUG(121): #16 pc 00010f44 /system/lib/libc.so 11-13 20:24:36.876: INFO/DEBUG(121): #17 pc 00010a30 /system/lib/libc.so 11-13 20:24:36.876: INFO/DEBUG(121): code around pc: 11-13 20:24:36.876: INFO/DEBUG(121): 802424c0 20061861 f7d418a2 2000ea7c ebdaf7d4 11-13 20:24:36.876: INFO/DEBUG(121): 802424d0 58234808 b1036bdb f8df4798 2026c01c 11-13 20:24:36.876: INFO/DEBUG(121): 802424e0 0000f88c ec40f7d4 00060f8c fffe1ecc 11-13 20:24:36.876: INFO/DEBUG(121): 802424f0 fffe5140 000003a4 deadd00d f8dfb40e 11-13 20:24:36.876: INFO/DEBUG(121): 80242500 b503c02c bf00490a 188ba200 f853aa03 11-13 20:24:36.876: INFO/DEBUG(121): code around lr: 11-13 20:24:36.876: INFO/DEBUG(121): afd16134 000ef9b0 22022100 ec98f7f7 463289a1 11-13 20:24:36.876: INFO/DEBUG(121): afd16144 5080f421 81a04629 000ef9b4 ec1ef7f7 11-13 20:24:36.876: INFO/DEBUG(121): afd16154 bf00bd70 4604b510 000ef9b0 ec06f7f7 11-13 20:24:36.876: INFO/DEBUG(121): afd16164 bfbe2800 f42389a3 81a35380 6d21db02 11-13 20:24:36.876: INFO/DEBUG(121): afd16174 6523180b bf00bd10 b085b5f0 bf004c41 11-13 20:24:36.876: INFO/DEBUG(121): stack: 11-13 20:24:36.876: INFO/DEBUG(121): 464c90f0 000005a0 11-13 20:24:36.876: INFO/DEBUG(121): 464c90f4 afd146c9 /system/lib/libc.so 11-13 20:24:36.876: INFO/DEBUG(121): 464c90f8 afd42498 /system/lib/libc.so 11-13 20:24:36.876: INFO/DEBUG(121): 464c90fc afd43bc8 /system/lib/libc.so 11-13 20:24:36.876: INFO/DEBUG(121): 464c9100 00000000 11-13 20:24:36.876: INFO/DEBUG(121): 464c9104 afd156e3 /system/lib/libc.so 11-13 20:24:36.876: INFO/DEBUG(121): 464c9108 afd14699 /system/lib/libc.so 11-13 20:24:36.876: INFO/DEBUG(121): 464c910c afd14699 /system/lib/libc.so 11-13 20:24:36.876: INFO/DEBUG(121): 464c9110 afd146f0 /system/lib/libc.so 11-13 20:24:36.876: INFO/DEBUG(121): 464c9114 802a3448 /system/lib/libdvm.so 11-13 20:24:36.876: INFO/DEBUG(121): 464c9118 802a3448 /system/lib/libdvm.so 11-13 20:24:36.876: INFO/DEBUG(121): 464c911c 0030e960 [heap] 11-13 20:24:36.876: INFO/DEBUG(121): 464c9120 0030e9b0 [heap] 11-13 20:24:36.876: INFO/DEBUG(121): 464c9124 afd146fd /system/lib/libc.so 11-13 20:24:36.876: INFO/DEBUG(121): 464c9128 df002777 11-13 20:24:36.876: INFO/DEBUG(121): 464c912c e3a070ad 11-13 20:24:36.876: INFO/DEBUG(121): #00 464c9130 465117b0 /dev/ashmem/mspace/dalvik-heap/2 (deleted) 11-13 20:24:36.876: INFO/DEBUG(121): 464c9134 80246563 /system/lib/libdvm.so 11-13 20:24:36.876: INFO/DEBUG(121): #01 464c9138 000b4890 [heap] 11-13 20:24:36.876: INFO/DEBUG(121): 464c913c 00000000 11-13 20:24:36.876: INFO/DEBUG(121): 464c9140 00000051 11-13 20:24:36.876: INFO/DEBUG(121): 464c9144 0030e960 [heap] 11-13 20:24:36.876: INFO/DEBUG(121): 464c9148 000b4890 [heap] 11-13 20:24:36.876: INFO/DEBUG(121): 464c914c 46512b88 /dev/ashmem/mspace/dalvik-heap/2 (deleted) 11-13 20:24:36.876: INFO/DEBUG(121): 464c9150 43277fac 11-13 20:24:36.876: INFO/DEBUG(121): 464c9154 802466f5 /system/lib/libdvm.so 

He intentado depurar un proceso nativo usando gdb pero solo doy este mensaje cuando falla la aplicación:

 Program received signal SIGSTOP, Stopped (signal). 

¿Alguien podría ayudarme a encontrar más pistas sobre el error?

Thx a todos.

Tal vez usted no está liberando algunas referencias que ha asignado, por ejemplo haciendo un montón de cadenas con env->NewStringUTF(path) . El sistema no se encarga de ello cuando está en código nativo. ¡O usted necesita eliminarlo usted mismo o usted necesita dejar el sistema volver al código de java!

Ver http://java.sun.com/docs/books/jni/html/refs.html#27567

5.2 Liberar Referencias

Cada referencia JNI consume una cierta cantidad de memoria por sí misma, además de la memoria tomada por el objeto referido. Como programador de JNI, debe tener en cuenta el número de referencias que su programa utilizará en un momento dado. En particular, debe tener en cuenta el límite superior del número de referencias locales que su programa puede crear en cualquier momento durante su ejecución, aunque estas referencias locales serán liberadas automáticamente por la máquina virtual. La creación de referencia excesiva, por muy transitoria que sea, puede llevar al agotamiento de la memoria.

  • Desplácese hasta la parte inferior de recyclerview con varios tipos de vista
  • Java.lang.IllegalArgumentException: Caracteres ilegales en la consulta en índice 59
  • OnClickListener en RecyclerView.ViewHolder
  • Cómo obtener correo electrónico de usuario en GraphRequest.newMeRequest
  • ¿Existe alguna razón para usar el patrón de observador en un receptor de difusión?
  • Error con Maven Android: El POM para com.google.android.gms: google-play-services: jar: 13.0.0 falta, no hay información de dependencia disponible
  • Android setOnclicklistener parámetro
  • ¿Todas las cadenas de un programa (en .java) se almacenan en la memoria RAM cuando se inicia (Android)?
  • Cómo cambiar dinámicamente el tamaño del texto en Android
  • Problema con el análisis Fecha cadena:
  • Error: java.lang.UnsatisfiedLinkError con roboelectric y reino
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.