【问题标题】:How to force Delphi to use D8.bat instead of dx.bat to compile Java 1.8 bytecode into DEX bytecode如何强制 Delphi 使用 D8.bat 而不是 dx.bat 将 Java 1.8 字节码编译成 DEX 字节码
【发布时间】:2018-11-01 06:46:49
【问题描述】:

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

Desugaring 允许您通过在构建过程中用旧的字节码和语言 API 替换新的字节码和语言 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

【问题讨论】:

  • 也许你可以修改 dx.bat 让它做 d8 做的事?
  • @DaveNottage 甚至只是让它调用 d8.bat
  • 是的,这是我的一个想法,但我想知道他们是否不是另一种解决方案,可以避免我“破坏”我的 android SDK
  • 它会如何“破坏”SDK?
  • @DaveNottage:因为现在 dx.bat 将不再是原来的 dx.bat,所以像 android studio 这样的产品将不再工作。但是是的,这个解决方案是可能的!

标签: delphi firemonkey dx android-d8


【解决方案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 编译器,其中“脱糖”默认开启。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    • 2018-01-31
    • 2023-02-08
    • 1970-01-01
    • 2018-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多