【问题标题】:Error while creating own jar library for Android project为 Android 项目创建自己的 jar 库时出错
【发布时间】:2015-11-29 03:21:45
【问题描述】:

目前我正在研究如何在 Android Studio 中创建 jar 库的基础知识。

我关注了How to make a .jar out from an Android Studio projecthow to create a jar file from android studio 教程。 并完成了第一个教程中描述的每个步骤。

但是,当我正在构建并运行这个库项目时,它会显示以下错误

错误:任务 ':app:preDexDebug' 执行失败。 com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'C:\Program Files\Java\jdk1.8.0_60\bin\java.exe'' 完成非零退出值 1

我在 SO 中研究了这个问题,但这些问题根本没有帮助我。这对我来说不是内存问题,因为所有其他应用程序都运行得很好。虽然我的项目没有完美编译,但我从库文件夹中获取了库 jar 文件,当我将该 jar 作为库导入其他项目时,我收到了相同的错误消息。

所以我认为我在这里遗漏了一些关键点。如果有人遇到类似问题或可以帮助我,请给我您的建议。

如果您希望我发布任何代码,请告诉我,我会这样做,谢谢。

我只是添加一个 java 库模块并在那里添加一个非常简单的Multiplication 类(检查下面的代码)。然后将该库模块添加为我的项目中的库。 库代码

public class Multiplication {

    public double multiply(int num1, int num2){
        return num1*num2;
    }
}

活动代码

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    edt1 = (EditText)findViewById(R.id.et1);
    edt2 = (EditText)findViewById(R.id.et2);
    btn  = (Button)findViewById(R.id.btn);
    tv = (TextView)findViewById(R.id.tvRes);

    multiplication = new Multiplication();

    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            double res = multiplication.multiply(Integer.parseInt(edt1.getText().toString()),Integer.parseInt(edt2.getText().toString()));

            tv.setText(Double.toString(res));
        }
    });

build.gradle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 22
    buildToolsVersion "22.0.1"

    defaultConfig {
        applicationId "com.example.myapplication"
        minSdkVersion 11
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.android.support:appcompat-v7:22.2.1'
    compile files('D:/Work_New/MyApplication/libs/mylibjar.jar')
}

完整的错误日志

Information:Gradle tasks [:app:assembleDebug]
:app:preBuild UP-TO-DATE
:app:preDebugBuild UP-TO-DATE
:app:compileDebugNdk UP-TO-DATE
:app:checkDebugManifest
:app:preReleaseBuild UP-TO-DATE
:mylibjar:compileJava UP-TO-DATE
:mylibjar:processResources UP-TO-DATE
:mylibjar:classes UP-TO-DATE
:mylibjar:jar UP-TO-DATE
:app:prepareComAndroidSupportAppcompatV72221Library UP-TO-DATE
:app:prepareComAndroidSupportSupportV42221Library UP-TO-DATE
:app:prepareDebugDependencies
:app:compileDebugAidl UP-TO-DATE
:app:compileDebugRenderscript UP-TO-DATE
:app:generateDebugBuildConfig UP-TO-DATE
:app:generateDebugAssets UP-TO-DATE
:app:mergeDebugAssets UP-TO-DATE
:app:generateDebugResValues UP-TO-DATE
:app:generateDebugResources UP-TO-DATE
:app:mergeDebugResources UP-TO-DATE
:app:processDebugManifest UP-TO-DATE
:app:processDebugResources UP-TO-DATE
:app:generateDebugSources UP-TO-DATE
:app:compileDebugJava UP-TO-DATE
:app:preDexDebug
UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dx.cf.iface.ParseException: bad class file magic (cafebabe) or version (0034.0000)
    at com.android.dx.cf.direct.DirectClassFile.parse0(DirectClassFile.java:472)
    at com.android.dx.cf.direct.DirectClassFile.parse(DirectClassFile.java:406)
    at com.android.dx.cf.direct.DirectClassFile.parseToInterfacesIfNecessary(DirectClassFile.java:388)
    at com.android.dx.cf.direct.DirectClassFile.getMagic(DirectClassFile.java:251)
    at com.android.dx.command.dexer.Main.processClass(Main.java:704)
    at com.android.dx.command.dexer.Main.processFileBytes(Main.java:673)
    at com.android.dx.command.dexer.Main.access$300(Main.java:83)
    at com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:602)
    at com.android.dx.cf.direct.ClassPathOpener.processArchive(ClassPathOpener.java:284)
    at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:166)
    at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:144)
    at com.android.dx.command.dexer.Main.processOne(Main.java:632)
    at com.android.dx.command.dexer.Main.processAllFiles(Main.java:510)
    at com.android.dx.command.dexer.Main.runMonoDex(Main.java:280)
    at com.android.dx.command.dexer.Main.run(Main.java:246)
    at com.android.dx.command.dexer.Main.main(Main.java:215)
    at com.android.dx.command.Main.main(Main.java:106)
...while parsing com/MultiplicationTest/Multiplication.class
1 error; aborting
Error:Execution failed for task ':app:preDexDebug'.
> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'C:\Program Files\Java\jdk1.8.0_60\bin\java.exe'' finished with non-zero exit value 1

虽然在我编译我的项目时它没有显示任何错误,但它显示了我提到的上述错误。

【问题讨论】:

  • @Heyyou 检查我编辑的帖子。基本上它就像一个测试库项目。
  • 您不能在“Android studio”中为“Android”创建 .jar 库,只能创建 java 库。对于 android,您需要创建 .aar 库。
  • 你能从你的项目中发布 gradle 吗?
  • @andro_abc 我正在创建 java 库。
  • @AnggrayudiH 检查我的 gradle 文件。

标签: java android android-studio jar


【解决方案1】:

更新 2

根据日志,您使用 Java 1.8 构建 *.jar。 Android 支持的最高 java 版本为 1.7。所以你必须将源代码兼容性设置为 1.7 并重建 jar 文件。

如果您不是从 gradle(或 Android Studio)构建此 jar,则需要更改 JDK 版本(文件 -> 项目结构 -> SDK 位置 -> JDK 位置)。

对于 gradle 模块,请参阅“更新 1”


更新 1

为您的 java 模块(您试图从中获取 jar)输入这些行:

apply plugin: 'java'
sourceCompatibility = 1.7
targetCompatibility = 1.7

尝试将下一个代码放入 Android 模块的 gradle 文件中:

android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
    }
}

【讨论】:

  • 我会尝试并告诉你。
  • 你想让我把这些代码放在哪里。因为在我的 java 模块中我没有任何 build.gradle 文件或任何我可以使用的设置文件apply plugin: 'java'
  • 您使用 Java 1.8 制作了 *.jar。 Android 支持的最高 java 版本为 1.7。所以你必须将源代码兼容性设置为 1.7。如果您不是从 gradle(或 Android Studio)构建此 jar,则必须更改设置(文件 -> 项目结构 -> SDK 位置 -> JDK 位置)。检查你是否在使用 1.7
  • 是的,你是正确的。我将我的 jdk 位置更改为 Java 1.7 并解决了问题。编辑您的答案,以便我接受。如果有办法使用 jdk 1.8 实现这一点,请也将其发布为答案。
【解决方案2】:

"non-zero exit value 1" 错误的原因可能不同。

1.删除库,然后重建项目以检查它是否工作。

2.如果工作正常,请从dependencies 中删除compile filetree 选项并重新构建它

dependencies {
compile 'com.android.support:appcompat-v7:22.2.1'
compile files('D:/Work_New/MyApplication/libs/mylibjar.jar')
}
  1. 如果还是有这个问题,创建一个简单的项目,先把jar库导入这个项目。接下来将这些其他依赖一一添加,找出问题所在。如果问题不再出现,则将所有java文件复制到这个新项目中。接下来一个接一个地复制"image"文件。通常可绘制的图像文件会导致此问题"non-zero exit value 1"

编辑: 还要在你的依赖项的android{ 中添加这个:

dexOptions {
    preDexLibraries = true
}

【讨论】:

  • 我没有正确理解你。如果我删除我的库,那么我该如何访问它的方法。
  • 对不起,我的意思是创建一个具有相同包名的新项目并添加所有这些库。(没有任何代码)。接下来如果问题仍然存在,请一个接一个地删除库。
【解决方案3】:

在 android 中,您不能将 .jar 文件用作其他 android 项目的库。您必须将 android-project 作为库导入并将项目设置为 lib-project。您必须将 android-lib-project 导入到您正在使用它的其他 android-project 中。

在 Eclipse 中就是这样,我猜在 Android Studio 中也是类似的方法

【讨论】:

  • 我不确定你在说什么,因为当我使用 eclipse 时,我使用了 jar 文件作为库和库项目。在 Android Studio 中,我们将 jar 文件添加为库并编译它们。
  • 听起来您想使用 android-project 作为库?还是您在谈论一个简单的 Java 项目?
  • 如果您查看我的问题,您可以在这些示例中看到我需要创建一个 Android 项目,然后将 java 库作为一个模块。然后我需要提取那个java库模块的jar。所以是的,它是一个以 java 库为模块的 Android 项目。
【解决方案4】:

我假设您的工作区中目前有两个项目: 1)Android应用项目(在gradle文件中标记为“apply plugin: 'com.android.application'”) 2)java库项目(“应用插件:'java'”) 它们都通过 settings.gradle 文件链接。

您应该能够通过 'assemble' 构建 java 项目,然后在 build/libs 文件夹中输出一个 .jar 文件(这也可以通过 Gradle 的 'jar' 命令完成)。

也许您可以在 Android Studio 中发布树结构的屏幕截图以获得更多帮助。

【讨论】:

    【解决方案5】:

    尝试像这样导入您的模块(一个 java 库):

    compile project(':MyLib');  // MyLib is a name of your module
    

    【讨论】:

    • 是的,我已经尝试过了。以前我像这样导入我的库模块,但它没有用,所以我正在试验。
    • 其实这是一个 java 库,所以它没有要求任何额外的 gradle 脚本。我猜在新的 android 模块中它会创建额外的 gradle 文件。如果我遗漏了什么,那么你可以在这里指导我。
    【解决方案6】:

    在使用 Java 1.8 SDK 构建我的 android 解决方案(有几个 java 模块)时,我也遇到了同样的错误。最后我用Gradle Retrolamdba Plugin修复了它

    将以下类路径添加到根项目中的 build.gradle 文件中

    classpath 'me.tatarka:gradle-retrolambda:3.2.4'
    

    并将retrolamdba插件插入位于子项目/java模块(jar库)中的build.gradle

    apply plugin: 'java'
    apply plugin: 'me.tatarka.retrolambda'
    

    【讨论】:

      猜你喜欢
      • 2014-08-28
      • 2013-07-08
      • 2013-06-08
      • 1970-01-01
      • 1970-01-01
      • 2013-07-30
      • 1970-01-01
      • 2014-02-21
      • 1970-01-01
      相关资源
      最近更新 更多