提问人:Bungles 提问时间:5/15/2021 最后编辑:derpirscherBungles 更新时间:5/15/2021 访问量:494
我可以在 Gradle 中设置变量并在编译时将其传递给 Java 吗?
Can I set a variable in Gradle and pass it to Java at compile time?
问:
我从 Android Studio 和 Visual Studio 构建相同的 Android 代码,我需要在 Java 代码中 #define,以便根据执行构建的环境以不同的方式编译一行代码。当 Java 没有 #defines 时,我该怎么做?
看来,最好的方法是根据构建环境在 Gradle 中定义一个变量,并让 Java 代码在编译时使用该变量来切换构建哪一行代码。不幸的是,我无法弄清楚如何做到这一点。
我需要类似于以下伪代码的功能
#ifdef $(VisualStudio)
LoadLibrary("libVS.so");
#elif $(AndroidStudio)
LoadLibrary("libAS.so");
#endif
这真的可能吗?有没有其他/更好的方法可以实现我的目标?
答:
1赞
derpirscher
5/15/2021
#1
我不熟悉在 Visual Studio 中构建 java Android 应用程序,但在 android studio 中使用 Gradle,您可能会使用不同的构建变体解决此类需求。所以我想这应该也可以使用 VS 和 Gradle。
一种可能性是定义一个类来保存库的名称(也可能有其他值)Environment
public final class Environment {
public static final String LIBRARY= "libAS.so";
}
然后,在您的类中,按给定名称加载库
LoadLibrary (Environment.LIBRARY);
然后,您可以为 vs code 生成添加另一个生成变体。对于不同的构建变体,您可以在构建期间使用不同版本的文件。只需为变体创建一个子文件夹,然后创建一个不同的类,保存正确的文件名。Environment
public final class Environment {
public static final String LIBRARY= "libVS.so";
}
现在,根据您选择构建的变体,将使用相应的类,从而加载正确的库。Environment
这种方法的一个缺点是,您可能需要复制所有现有的构建变体。但另一方面,你可以有一个点,你可以把所有环境特定的值放在其中,而不必担心在不同的 java 文件中使用正确的值,因为你没有任何条件编译。
评论
0赞
Bungles
5/15/2021
我已经将变体用于其他目的,因此这种方法将导致变体/口味的大量扩散。
0赞
derpirscher
5/15/2021
我知道,创建许多新变体可能是一项繁琐的任务。因此,也许您可以利用这种方法来替换库的名称,例如基于环境变量 stackoverflow.com/questions/33464577/...
0赞
derpirscher
5/15/2021
您甚至可以将那里的替换与我答案的环境类方法结合起来。因此,您仍然可以使用一个中心类来保存您的环境相关值,并且替换的 gradle 任务只需通过单个文件
评论