2017-01-18 14 views
0

ПРОБЛЕМА:ProGuard не работает с JNI (родной строки)

позволяет ProGuard на андроид студии вместе с JNI не удалось завершить проект из-за этой ошибки:

Примечание: были 11 обращений к класса посредством интроспекции. Вы должны рассмотреть явно держать упомянутые члены класса

ИСХОДНЫЙ КОД:

JNI код:

JNIEXPORT jstring JNICALL 
Java_example_example(JNIEnv *env, jobject instance) { 

    return (*env)->NewStringUTF(env, "example"); 

} 

Java код:

public native String example(); 

ПРОБОВАЛИ:

1) добавить по правилам Proguard:

-keep class * { // I also tried to put the class one by one instead of * 

native <methods>; // or "*;" , "public native <methods>" , "public *;" 

} 

2) добавить по правилам Proguard (успешно строить, деятельность не запустить на устройстве):

-ignorewarn

+0

Можете ли вы поделиться своим именем класса и идентификатором пакета java? (возможно, проблема в том, что вы не объявляете свою JNI-функцию правильным способом). –

+0

Идентификатор пакета приложения - app.myapplication (приложение полной работы без proguard) –

ответ

0

Так что ответ прост - вы необходимо изменить функцию C следующим образом:

JNIEXPORT jstring JNICALL 
Java_app_myapplication_example(JNIEnv *env, jobject instance) { 

    return (*env)->NewStringUTF(env, "example"); 

} 
+0

уже и так было таким примером, моя проблема - включить proguard (с jni show error Примечание: для интроспекции были N доступа к членам класса. Вы должны рассмотреть возможность явного сохранения указанных членов класса. –

+0

Вы пытались добавить: -keep class app.myapplication. * {*;} в свой proguard-rules.pro? –

+0

FAILURE: Строить неудачу с исключением * Что пошло не так:. Execution Сбой задачи ": приложение: transformClassesAndResourcesWithProguardForRelease. > java.io.IOException:. Пожалуйста, исправьте вышеуказанные предупреждения первым –