2016-05-19 12 views
2

ProGuardを使用して、Java Desktopアプリケーションを難読化しています。ProGuard JNIエラー

また
<dependencies> 
    <dependency> 
     <groupId>commons-io</groupId> 
     <artifactId>commons-io</artifactId> 
     <version>LATEST</version> 
    </dependency> 
    <dependency> 
     <groupId>com.github.dblock</groupId> 
     <artifactId>oshi-core</artifactId> 
     <version>LATEST</version> 
    </dependency> 
    <dependency> 
     <groupId>net.lingala.zip4j</groupId> 
     <artifactId>zip4j</artifactId> 
     <version>LATEST</version> 
    </dependency> 
    <dependency> 
     <groupId>commons-codec</groupId> 
     <artifactId>commons-codec</artifactId> 
     <version>LATEST</version> 
    </dependency> 
    <dependency> 
     <groupId>org.xerial</groupId> 
     <artifactId>sqlite-jdbc</artifactId> 
     <version>LATEST</version> 
    </dependency> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-nop</artifactId> 
     <version>LATEST</version> 
    </dependency> 
    <dependency> 
     <groupId>com.google.jimfs</groupId> 
     <artifactId>jimfs</artifactId> 
     <version>LATEST</version> 
    </dependency> 
    <dependency> 
     <groupId>org.softsmithy.lib</groupId> 
     <artifactId>softsmithy-lib-core</artifactId> 
     <version>LATEST</version> 
    </dependency> 
</dependencies> 

私ProGuardの設定:私は私のプロジェクトでは、以下のMavenの依存関係を使用してい

> java -jar program.jar 
Error: A JNI error has occurred, please check your installation and try again 
Exception in thread "main" java.lang.VerifyError: Expecting a stackmap frame at branch target 80 
Exception Details: 
    Location: 
    MyMainClass.a(Ljava/lang/String;)Ljava/lang/String; @40: iflt 
    Reason: 
    Expected stackmap frame at this location. 
    Bytecode: 
    0x0000000: 0406 7805 0882 8206 0882 0778 0482 0659 
    0x0000010: 7808 822a b600 0f59 bc05 0459 585f 0464 
    0x0000020: 5b3e 4c36 045b 583d 9b00 282b 2a1d 5ab6 
    0x0000030: 000e 8403 ff1c 8292 551d 9b00 162b 2a1d 
    0x0000040: 8403 ff5a b600 0e15 0482 9255 1da7 ffdb 
    0x0000050: bb00 0659 2bb7 000d b0 

     at java.lang.Class.getDeclaredMethods0(Native Method) 
     at java.lang.Class.privateGetDeclaredMethods(Unknown Source) 
     at java.lang.Class.privateGetMethodRecursive(Unknown Source) 
     at java.lang.Class.getMethod0(Unknown Source) 
     at java.lang.Class.getMethod(Unknown Source) 
     at sun.launcher.LauncherHelper.validateMainClass(Unknown Source) 
     at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source) 

:私は難読化JARを起動すると、私は次のエラーを取得していますファイルは次のようになります。

-microedition 
-dontskipnonpubliclibraryclassmembers 
-keepdirectories 
-target 1.8 
-forceprocessing 
-dontoptimize 
-allowaccessmodification 
-overloadaggressively 
-keeppackagenames org.** 
-dontpreverify 
-verbose 
-dontwarn **.** 


-keep class org.sqlite.** { 
    <fields>; 
    <methods>; 
} 

-keep class com.sun.** { 
    <fields>; 
    <methods>; 
} 

-keep class com.google.** { 
    <fields>; 
    <methods>; 
} 

-keep class oshi.** { 
    <fields>; 
    <methods>; 
} 

# Rest omitted 

最適化、事前確認、縮小、難読化を無効にして、-target 1.8フラグを削除しようとしました。それだけでエラーが消えます。

しかし、私はすべてのオプションを保持し、出力を中断しないでくださいJARそれ以外は無意味です。それ、どうやったら出来るの?あなたはデスクトップアプリケーションを構築している

+0

事前確認、縮小、またはターゲティングは必要ありません。これら3つのものがなければ、あなたのjarファイルは正しくコンパイルされ、実行されますか? –

+0

@DankVader: いいえ、難読化をオンにしても、それが壊れます。 – BullyWiiPlaza

+1

以前は「事前確認は必要ありません」と言いましたが、それを試してみてください。エラーを見て、開発者の一人は、Java 7 +でそれを使用しないとVerifyエラーにつながる可能性があると述べています。私は個人的に問題に遭遇したことはありません。 –

答えて

1

は、これは、次のオプションを無効にする必要があります。また、事前検証は、このように、あなたも無効にする必要がある、Javaのバージョン7+のために必要とされる

-microedition 

-dontpreverify 

-target 1.8も省略できます。