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
それ以外は無意味です。それ、どうやったら出来るの?あなたはデスクトップアプリケーションを構築している
事前確認、縮小、またはターゲティングは必要ありません。これら3つのものがなければ、あなたのjarファイルは正しくコンパイルされ、実行されますか? –
@DankVader: いいえ、難読化をオンにしても、それが壊れます。 – BullyWiiPlaza
以前は「事前確認は必要ありません」と言いましたが、それを試してみてください。エラーを見て、開発者の一人は、Java 7 +でそれを使用しないとVerifyエラーにつながる可能性があると述べています。私は個人的に問題に遭遇したことはありません。 –