簡體   English   中英

為Android項目創建自己的jar庫時出錯

[英]Error while creating own jar library for Android project

目前我正在研究如何在Android Studio中創建jar庫的基礎知識。

我按照如何從Android Studio項目 中創建一個.jar以及如何從android studio教程創建一個jar文件 並完成了第一個教程中描述的每個步驟。

但是,當我構建並運行此庫項目時,它向我顯示以下錯誤

錯誤:任務':app:preDexDebug'的執行失敗。 com.android.ide.common.process.ProcessException:org.gradle.process.internal.ExecException:進程'命令'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

雖然我在編譯項目時沒有顯示任何錯誤,但它向​​我顯示了我提到的上述錯誤。

更新2

根據日志,您使用Java 1.8構建* .jar。 Android支持的最大java版本是1.7。 因此,您必須將源代碼兼容性設置為1.7並重建jar文件。

如果您不是從gradle(或Android Studio)構建此jar,則需要更改JDK版本(文件 - >項目結構 - > SDK位置 - > JDK位置)。

對於gradle模塊,請參閱“Update 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
    }
}

"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
}

在android中你不能使用.jar文件作為其他android項目的庫。 你必須將android-project導入為庫並將項目設置為lib-project。 你必須將android-lib-project導入到你正在使用它的每個其他android項目中。

這就是eclipse中的情況,我想在Android Studio中它是一種類似的方法

我假設你的工作區目前有兩個項目:1)Android應用程序項目(在gradle文件中標記為“apply plugin:'com.android.application'”)2)java庫項目(“apply plugin:'java'”)它們都通過settings.gradle文件鏈接。

您應該能夠通過'assemble'構建java項目,然后在build / libs文件夾中輸出.jar文件(這也可以通過Gradle的'jar'命令完成)。

也許您可以在Android Studio中發布樹結構的屏幕截圖以獲得更多幫助。

嘗試導入你的模塊(一個java庫),如下所示:

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

在使用Java 1.8 SDK構建我的android解決方案(有幾個java模塊)時,我也遇到了同樣的錯誤。 最后我用Gradle Retrolamdba插件修復了它

將以下類路徑添加到根項目中的build.gradle文件中

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

並且retrolamdba插件位於子項目/ java模塊(jar庫)中的build.gradle

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM