Marco Cauli
Marco Cauli

Reputation: 31

Unity Failed to Build apk Android

i followed the unity "tanks!" tutorial and now i'm trying to port the game on Android, it's my first time on Unity, now when it's going to build the APK unity tells me "Failed To Build APK" and then i get some errors, i'm attaching you the error i think it's fatal, please tell me what's wrong with it.

CommandInvokationFailure: Failed to build apk.
C:/Program Files/Java/jdk-9.0.1\bin\java.exe -Xmx2048M -D com.android.sdkmanager.toolsdir="C:/Android_SDK\tools" -D file.encoding=UTF8 -jar "C:\Program Files\Unity\Editor\Data\PlaybackEngines\AndroidPlayer/Tools\sdktools.jar"-

stderr[
    Exception in thread "main" java.lang.reflect.InvocationTargetException
            at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
            at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            at java.base/java.lang.reflect.Method.invoke(Method.java:564)
            at SDKMain.main(SDKMain.java:130)
    Caused by: java.lang.NoClassDefFoundError: sun/misc/BASE64Encoder
            at com.android.sdklib.internal.build.SignedJarBuilder.<init>(SignedJarBuilder.java:177)
            at com.android.sdklib.build.ApkBuilder.init(ApkBuilder.java:446)
            at com.android.sdklib.build.ApkBuilder.<init>(ApkBuilder.java:422)
            at com.android.sdklib.build.ApkBuilder.<init>(ApkBuilder.java:362)
            at UnityApkBuilder.<init>(UnityApkBuilder.java:214)
            at UnityApkBuilder.main(UnityApkBuilder.java:34)
            ... 5 more
    Caused by: java.lang.ClassNotFoundException: sun.misc.BASE64Encoder
            at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:466)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:563)
            at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:496)
        ... 11 more
]
stdout[

]

exit code: 1
UnityEditor.Android.Command.WaitForProgramToRun (UnityEditor.Utils.Program p, UnityEditor.Android.WaitingForProcessToExit waitingForProcessToExit, System.String errorMsg)
UnityEditor.Android.Command.Run(System.Diagnostics.ProcessStartInfo psi, UnityEditor.Android.WaitingForProcessToExit waitingForProcessToExit, System.String errorMsg)
UnityEditor.Android.AndroidSDKTools.RunCommandInternal (System.String javaExe, System.String sdkToolsDir, System.String[] sdkToolCommand, Int32 emoryMB, System.String workingdir, UnityEditor.Android.WaitingForProcessToExit waitingForProcessToExit, System.String errorMsg)
UnityEditor.Android.AndroidSDKTools.RunCommandSafe (System.String javaExe, System.String sdkToolsDir, System.String[] sdkToolCommand, Int32 emoryMB, System.String workingdir, UnityEditor.Android.WaitingForProcessToExit waitingForProcessToExit, System.String errorMsg)

Upvotes: 3

Views: 2460

Answers (1)

Naman
Naman

Reputation: 32036

If you execute jdeps on your application, you would be able to see that sun.misc.BASE64Encoder has been deprecated and can be replaced with java.util.Base64 which is there since JDK 1.8.

The migration guide reads this as well :

A few sun.* APIs have been removed in JDK 9. Notably, sun.misc.BASE64Encoder and sun.misc.BASE64Decoder have been removed. Instead, use the supported java.util.Base64 class, which was added in Java SE 8.


In your case, since you rely on third parties(android sdktools) which themselves haven't resolved this. I'm afraid you might have to stick with 1.8 and in the meanwhile, this can be reported to their trackers once they plan to migrate their artifacts.

Of course, this also means you would have to at some point in time upgrade to using their Java 9 compatible version of the jar if and when they plan to release.

Update : This can be tracked on Unity#956425 for further updates.

Upvotes: 6

Related Questions