1

今天我遇到了一个问题。我的项目需要使用一些使用 Java 1.8 功能的库 (*.jar)。我看到越来越多的库现在使用 Java 1.8 功能(如 webRTC、exoplayer 等)。这样,我们必须进行脱糖

脱糖允许您通过在构建过程中用旧的替换新的字节码和语言 API 来在旧设备上使用这些功能

使用d8.bat(替换dx.bat),默认情况下会打开脱糖。因此,您现在可以在针对旧设备的同时使用大多数最新的语言更改。

当我们编译一个项目时,Delphi 在后台这样做:

dx.bat --dex --output="C:\Dev\output\libwebrtc-dexed.jar" "C:\Dev\lib\libwebrtc.jar"

对于包含 Java 1.8 功能的库,这将失败。

所以 Delphi 必须这样做:

d8.bat --lib C:\SDKs\android-sdk-windows\platforms\android-28\android.jar --output="C:\Dev\output\libwebrtc-dexed.jar" "C:\Dev\ lib\libwebrtc.jar"

知道如何告诉 Delphi 使用d8.bat而不是dx.bat

4

1 回答 1

1

我找到了一个修改“CodeGear.Common.Targets”文件(Delphi 的 bin 文件夹)的解决方案,创建了一个替代命令,仅用于使用 d8.bat 而不是 dx.bat 生成 dex:

1)关闭IDE

2) 编辑“CodeGear.Common.Targets”,本地化 DxCmd 定义,并添加这两行,为 d8.bat 创建一个新命令:

<JavaD8Path>@(JavaAaptPath->'%(RootDir)%(Directory)')d8.bat</JavaD8Path>
<D8Cmd>PATH $(JDKPath)\bin;$(PATH) %26 "$(JavaD8Path)" --output=</D8Cmd>

3) 现在本地化用于生成 dex 文件的目标并将DxCmd替换为新的D8Cmd

  <!-- Generate a "dexed" version of the customized jar files if they doesn´t exists -->
  <Target Name="BuildPredexedJar" DependsOnTargets="GetProjectJars">
    <Exec Condition="( '@(_JarsLocations)'!='' And !Exists('%(_JarsLocations.PredexedJar)') )"
        Command='$(D8Cmd)"%(_JarsLocations.PredexedJar)" %22%(_JarsLocations.FullPath)%22'/>
  </Target>

4)现在dex生成将使用d8.bat编译器,其中“desugaring”默认开启。

于 2019-04-04T14:46:28.580 回答