Mantener los métodos Java llamados desde Android JNI

Estoy tratando de ofuscar un código de aplicación para Android a través de Proguard. Después de procesar con proguard la aplicación está trabajando por sí mismo, sin embargo las llamadas nativas hechas de c a java están fallando con java.lang.NoSuchMethodError .

Este código es de la parte nativa, donde se realiza una llamada a la instancia de clase java, denominada EngineStarted:

 void callEngineStarted( JNIEnv* env, bool isStreamOne ) { jclass cls; if(isStreamOne == true) { cls = ( *env )->GetObjectClass( env, currentObjectOne ); } else { cls = ( *env )->GetObjectClass( env, currentObjectTwo ); } jmethodID midCallBack = ( *env )->GetMethodID( env, cls, "EngineStarted", "(I)V" ); if (0 == midCallBack) { LOGW("Could not find EngineStarted method in class"); return; } if(isStreamOne == true) { ( *env )->CallVoidMethod( env, currentObjectOne, midCallBack, 1 ); } else { ( *env )->CallVoidMethod( env, currentObjectTwo, midCallBack, 0 ); } } 

El java tiene este método. Sólo se llama desde la parte nativa, y no en ningún otro lugar. Debido a eso, proguard está quitando el método.

  public void EngineStarted ( int isStreamOne ) { Log.v( "decoderService", "PDecoder - Engine started, using stream " + ( isStreamOne == 1 ? "one" : "two" ) ); this.isStreamOne = isStreamOne == 1; // Initialize the player InitializePlayer( isStreamOne ); } 

He intentado agregar esto a proguard-project.txt, pero no solucioné el problema.

 -keep class com.emrahgunduz.AppBase.Services.PlayService.players.pDecoders.PDecoderNative { void EngineStarted( int ); void PositionChanged( int ); void SetDuration( int ); void Completed(); void CompletedWithFade(); void Spectrum ( *** ); } 

Después de compilar, mapping.txt no incluye los métodos, sospecho que proguard los elimina. ¿Cómo puedo evitar que estos métodos sean eliminados y / o renombrados?

EDIT / SOLUCIÓN:

Pude resolver el problema cambiando la localización completa con un comodín. Esto salvó algunos de los métodos, pero no fue suficiente. No sé por qué, pero un otro método ( void InitializePlayer(int) ) que fue llamado por los que fueron objeto de dumping también fueron objeto de dumping que de alguna manera creó una reacción en cadena. La adición de este método resolvió los restantes métodos faltantes. La solución final se

 -keepclassmembers class **.PDecoderNative { native <methods>; void InitializePlayer(int); void EngineStarted(int); void PositionChanged(int); void SetDuration(int); void Completed(); void CompletedWithFade(); void Spectrum(float[]); } 

EDIT: El problema no fue con el proguard, pero con proguard no poder leer el archivo project.txt de vez en cuando. Movió todo el proyecto a una nueva ubicación en el disco y volvió a crear el archivo. Está funcionando perfectamente.

Su análisis es correcto y su configuración también parece correcta. Debe comprobar de nuevo el nombre completo de su clase (com.emrahgunduz.AppBase.Services.PlayService.players.pDecoders.PDecoderNative). Tenga en cuenta que debe utilizar '$' en lugar de '.' Para separar clases internas, si es aplicable.

Si ha especificado los nombres correctos, los verá en el archivo proguard / seeds.txt que ProGuard escribe en el proceso de compilación de Android.

Una vez que esto funcione, puede reemplazarlo por -keepclassmembers . ProGuard seguirá conservando los nombres de los métodos, pero ofuscará el nombre de la clase, lo cual está bien en este caso.

  • Errores de Proguard al exportar el proyecto de Android después de actualizar a ADT 20
  • ¿Por qué proguard procesa AndroidManifest.xml?
  • ¿Dexguard evita grietas simples de LVL?
  • Problema Proguard con SAAgent (accesorio Samsung) java.lang.NoSuchMethodException: <init>
  • Hora de Joda y error de ProGuard al exportar .apk
  • Cómo usar Kotlin con Proguard
  • "No se puede encontrar la clase referenciada" con Proguard y Kotlin
  • Configuración de ProGuard con proyectos de la biblioteca de Android
  • ¿Cómo configurar Proguard en Android Studio?
  • Uso de Proguard para eliminar clases no utilizadas en la biblioteca de Servicios de Google Play
  • Gradle no se pudo construir cuando proguard está activado
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.