1

我正在尝试使用 gradle 构建一个 android 项目:它是一个具有 ndk 风格的库项目.jar,由 Unity 提供的 external 调味。

我真的不认为有关 gradle 文件的详细信息很重要,足以说明我将外部 jar 文件(由 Unity 提供)包括以下内容:

  dependencies {
    compile files('libs/unity.jar')
  }

实际上似乎有效,因为在 java 编译期间,gradle 发出如下命令:

BASE="<Some directory>"
javac -d "${BASE}/PluginsSources/Android/libproject/build/intermediates/classes/fat/debug" \
    -g -encoding UTF-8 \
    -bootclasspath /Users/myusername/Applications/adt/sdk/platforms/android-23/android.jar \
    -sourcepath "${BASE}/PluginsSources/Android/libproject/build/tmp/compileFatDebugJavaWithJavac/emptySourcePathRef" \
    -classpath "${BASE}/PluginsSources/Android/libproject/libs/unity.jar" \
    "${BASE}/PluginsSources/Android/libproject/src/main/java/org/example/ScriptBridge/JavaClass.java" \
    "${BASE}/PluginsSources/Android/libproject/build/generated/source/r/fat/debug/org/example/ScriptBridge/R.java" \
    "${BASE}/PluginsSources/Android/libproject/build/generated/source/buildConfig/fat/debug/org/example/ScriptBridge/BuildConfig.java" \
    -XDuseUnsharedTable=true

BASE您真正添加的缩进和变量。请注意,这unity.jar是一个类路径条目。

问题是,编译失败,因为 javac 在编译时显然无法在其中找到一个类unity.jar除非该 jar 被放入 -bootclasspath 选项(!!)。

为什么会这样?AFAIK,类的搜索路径应该是分层的,在 bootclasspath 之后,javac 应该搜索类路径......

是否可以告诉 gradle 将一些 jar 插入 bootclasspath somhow(这会笨拙地解决问题)?

有没有更清洁/更好的方法?

感谢您的任何见解!

4

1 回答 1

1

编辑:

经过更仔细的审查,看起来这很classpath有效(惊喜!)而且 Unity Technologies 并没有创建一个突变类路径弹性 jar,因为它是接管世界的第一步,毕竟......

问题出在compile语句的路径中,用正确的 jar 相对路径替换它后,一切都按预期工作。

问题点的答案是:

Q1:为什么会这样?

因为java在不存在的jar中找不到类

Q2:是否可以告诉 gradle 将一些 jar 粘贴到 bootclasspath somhow 中?

请看下面的答案

Q3:有没有更清洁/更好的方法?

是的:确保你链接的路径是正确的可能是一个好的开始:)

请注意,jar即使在调试模式下(恕我直言,这是臭名昭著的),gradle 也不会为缺少 s 发出任何错误。


旧答案

我必须自己解决这个问题,不知何故(我认为我的解决方法不是最佳的,但考虑到对这个问题的关注,我想它会尽可能好......)

Q1:为什么会这样?

据我了解,没有翻转的原因。

文件:

如何找到类(Oracle 规范)

明确指定引导程序中的类是:

引导类是实现 Java 2 平台的类。

即用于实现平台的类。这就是为什么android.jar存在,unity.jar 不应该存在

Q2:是否可以告诉 gradle 将一些 jar 粘贴到 bootclasspath somhow 中?

是的!以下链接详细说明了如何:

修改编译器参数中的引导类路径(gradle 论坛)

那就是:

allprojects {
  gradle.projectsEvaluated {
    tasks.withType(JavaCompile) {
      options.compilerArgs << "Xbootclasspath/a:src/main/libs/unity.jar"
    }
  }
}

其中,在我的项目中,映射到在 android 之后加载一个unity.jar存档,位于src/main/libs我的 android 库的目录中。

Q3:有没有更清洁/更好的方法?

我不这么认为,至少不是不理解为什么jar首先需要在引导程序中(这会使这里的大多数问题毫无意义):更改引导程序类路径不是高级程序员应该做的事情,所以我不希望 gradle 提供更简洁的快捷方式。

我仍在等待对这个问题有一些见解的人(我不能花更多的时间在这上面),但我希望这无论如何都会对某人有所帮助。

于 2015-09-17T13:21:24.423 回答