2016-06-17 11 views
1

私はJNIライブラリを使用するアンドロイドアプリにproguardを適用しようとしています。アプリを実行すると
、私はこのクラッシュを取得しています:Proguard: `seeds.txt`にフィールドがあるにもかかわらず` NoSuchFieldError`

Thread[24,tid=8563,WaitingForJniOnLoad,Thread*=0xb510a400,peer=0x12f57190,"Service Thread"] recursive attempt to load library "/data/app/com.my.package-1/lib/arm/nativeLibrary.so" 
No pending exception expected: java.lang.NoSuchFieldError: no "I" field "mNativeInstanceId" in class "Lcom/library/package/NativeDetector;" or its superclasses 
    at java.lang.String java.lang.Runtime.nativeLoad(java.lang.String, java.lang.ClassLoader, java.lang.String) (Runtime.java:-2) 
    at java.lang.String java.lang.Runtime.doLoad(java.lang.String, java.lang.ClassLoader) (Runtime.java:428) 
    at void java.lang.Runtime.loadLibrary(java.lang.String, java.lang.ClassLoader) (Runtime.java:369) 
    at void java.lang.System.loadLibrary(java.lang.String) (System.java:989) 
    at void com.library.package.NativeDetector.<clinit>() (SourceFile:48) 
    at com.library.package.DectorTypeA com.library.package.Detectors.createInstance() (SourceFile:63) 
    at com.library.package.DectorTypeA com.library.package.imageAnalysis.DetectorProvider.a() (SourceFile:31) 
    at com.library.package.DectorTypeA com.library.package.imageAnalysis.DetectorProvider.provideDetector() (SourceFile:24) 
    at com.library.package.DectorTypeA com.library.package.myService.e() (SourceFile:205) 
    at com.library.package.DectorTypeA com.library.package.myService.c(com.library.package.myService) (SourceFile:43) 
    at void com.library.package.myService$2.run() (SourceFile:226) 

mNativeInstanceIdが難読化されたようなエラーメッセージが見えます。しかし、ライブラリモジュールのseeds.txtは、このラインを持っている:それは難読化されていなかったという意味

com.library.package.NativeDetector: int mNativeInstanceId

このクラッシュを解決するにはどうすればよいですか?ライブラリモジュールの

proguard-rules.pro

-keep class com.om.library.package.NativeDetector { 
    private <fields>; 
} 
:私も結果に変化がないと、このような線でProGuardのファイルを試してみた:編集

class NativeDetector { 

    private int mNativeInstanceId; //intialized in JNI code 
    ... 
} 

-keepparameternames 
-renamesourcefileattribute SourceFile 
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod,LocalVariableTable 

-keep public class * { 
    public protected *; 
} 

-keepclassmembernames class * { 
    java.lang.Class class$(java.lang.String); 
    java.lang.Class class$(java.lang.String, boolean); 
} 

-keepclasseswithmembernames,includedescriptorclasses class * { 
    native <methods>; 
} 

-keepclassmembers enum * { 
    public static **[] values(); 
    public static ** valueOf(java.lang.String); 
} 


-keep class com.library.package.NativeDetector 

-keepclassmembers class com.library.package.NativeDetector { 
    private <fields>; 
} 

NativeDetector.java

+0

なぜ私はJNIがプライベート変数をロードできると思っていますか? –

+0

プロガードが無効になっているときに機能しますか?それは第三者によって制作された図書館ですが。私は 'private int mNativeInstanceId;'と言っているのは、JNIコードによって初期化されています。なぜなら、それはコメントのことです。 – Michiyo

+0

申し訳ありません - 私はproguardやJNIについて何も知らないので、別の関数が私的変数に直接影響することを期待していると私は奇妙に思えます。 –

答えて

1

あなたが直面している問題は、proguardは、ライブラリモジュールに対してのみルールを適用します。これらは、consumerProguardFilesと指定しないかぎり、アプリケーションに対して自動的に選択されません。

+1

これらのルールはライブラリモジュールにのみ追加されている可能性があります。これらは 'consumerProguardFiles'として指定しないかぎり、アプリケーションのために自動的には選択されません。 –

+0

それは私が行方不明だったものでした!あなたが答えたい場合は、待っている期間が終わったときに賞金を授与します。 @トム – Michiyo

+0

私は答えを更新しました。 –

関連する問題