为 Android 项目创建自己的 jar 库时出错
Error while creating own jar library for Android project
目前我正在研究如何在 Android Studio 中创建 jar 库的基础知识。
我遵循了 How to make a .jar out from an Android Studio project and 教程。
并完成了第一个教程中描述的每个步骤。
然而,当我正在构建和 运行 这个库项目时,它向我显示以下错误
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
我在 SO 中调查了这个问题,但这些问题对我没有任何帮助。这对我来说不是内存问题,因为所有其他应用程序 运行 都很好。尽管我的项目没有完美编译,但我仍然从我的库文件夹中获取了库 jar 文件,当我将该 jar 作为库导入其他项目时,我收到了相同的错误消息。
所以我想我在这里遗漏了一些关键点。如果有人遇到类似问题或可以帮助我,请给我你的建议。
如果您想让我 post 我的任何代码,请告诉我,我会这样做,谢谢。
我只是添加了一个 java 库模块并在那里添加了一个非常简单的 Multiplication
class(检查下面的代码)。然后将该库模块作为库添加到我的项目中。
图书馆代码
public class Multiplication {
public double multiply(int num1, int num2){
return num1*num2;
}
}
Activity代码
@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.access0(Main.java:83)
at com.android.dx.command.dexer.Main.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
虽然在我编译我的项目时它没有显示任何错误,但它显示了我提到的上述错误。
在 android 中,您不能将 .jar 文件用作其他 android 项目的库。您必须将 android-project 作为库导入并将该项目设置为 lib-project。您必须将 android-lib-project 导入彼此 android-project 中使用它。
在 eclipse 中就是这样,我想在 Android Studio 中也是类似的方法
更新 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
尝试将下一个代码放入 gradle 文件中 Android 模块:
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
}
}
我假设您的工作区中目前有两个项目:
1) Android 应用程序项目(在 gradle 文件中标记为 "apply plugin: 'com.android.application'")
2) java 图书馆项目 ("apply plugin: 'java'")
它们都通过 settings.gradle 文件链接。
您应该能够通过 'assemble' 构建 java 项目,然后在 build/libs 文件夹中输出一个 .jar 文件(这也可以通过 'jar' Gradle 的命令)。
也许您可以 post 在 Android Studio 中获取树结构的屏幕截图以获得更多帮助。
尝试像这样导入您的模块(java 库):
compile project(':MyLib'); // MyLib is a name of your module
"non-zero exit value 1"
错误的原因可能不同。
1.Delete 库,然后重建项目以检查它是否正常工作。
2.If 它工作正常从 dependencies
中删除 compile filetree
选项并再次重建它
dependencies {
compile 'com.android.support:appcompat-v7:22.2.1'
compile files('D:/Work_New/MyApplication/libs/mylibjar.jar')
}
- 如果还是出现这个问题,新建一个简单的工程,先将jar库导入到这个工程中。接下来将这些其他的依赖一一添加,发现problem.If问题没有再出现,将所有java文件复制到这个新项目中。接下来一个接一个的复制
"image"
个文件。通常可绘制的图像文件会导致此问题 "non-zero exit value 1"
编辑:
还要在依赖项的 android{
中添加:
dexOptions {
preDexLibraries = true
}
我在使用 Java 1.8 SDK 构建我的 android 解决方案(有几个 java 模块)时也遇到了同样的错误。最后我用 Gradle Retrolamdba Plugin
修复了它
将以下类路径添加到根项目的 build.gradle 文件中
classpath 'me.tatarka:gradle-retrolambda:3.2.4'
并且 retrolamdba 插件到 build.gradle 位于子 project/java 模块(jar 库)
apply plugin: 'java'
apply plugin: 'me.tatarka.retrolambda'
目前我正在研究如何在 Android Studio 中创建 jar 库的基础知识。
我遵循了 How to make a .jar out from an Android Studio project and
然而,当我正在构建和 运行 这个库项目时,它向我显示以下错误
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
我在 SO 中调查了这个问题,但这些问题对我没有任何帮助。这对我来说不是内存问题,因为所有其他应用程序 运行 都很好。尽管我的项目没有完美编译,但我仍然从我的库文件夹中获取了库 jar 文件,当我将该 jar 作为库导入其他项目时,我收到了相同的错误消息。
所以我想我在这里遗漏了一些关键点。如果有人遇到类似问题或可以帮助我,请给我你的建议。
如果您想让我 post 我的任何代码,请告诉我,我会这样做,谢谢。
我只是添加了一个 java 库模块并在那里添加了一个非常简单的 Multiplication
class(检查下面的代码)。然后将该库模块作为库添加到我的项目中。
图书馆代码
public class Multiplication {
public double multiply(int num1, int num2){
return num1*num2;
}
}
Activity代码
@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.access0(Main.java:83)
at com.android.dx.command.dexer.Main.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
虽然在我编译我的项目时它没有显示任何错误,但它显示了我提到的上述错误。
在 android 中,您不能将 .jar 文件用作其他 android 项目的库。您必须将 android-project 作为库导入并将该项目设置为 lib-project。您必须将 android-lib-project 导入彼此 android-project 中使用它。
在 eclipse 中就是这样,我想在 Android Studio 中也是类似的方法
更新 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
尝试将下一个代码放入 gradle 文件中 Android 模块:
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
}
}
我假设您的工作区中目前有两个项目: 1) Android 应用程序项目(在 gradle 文件中标记为 "apply plugin: 'com.android.application'") 2) java 图书馆项目 ("apply plugin: 'java'") 它们都通过 settings.gradle 文件链接。
您应该能够通过 'assemble' 构建 java 项目,然后在 build/libs 文件夹中输出一个 .jar 文件(这也可以通过 'jar' Gradle 的命令)。
也许您可以 post 在 Android Studio 中获取树结构的屏幕截图以获得更多帮助。
尝试像这样导入您的模块(java 库):
compile project(':MyLib'); // MyLib is a name of your module
"non-zero exit value 1"
错误的原因可能不同。
1.Delete 库,然后重建项目以检查它是否正常工作。
2.If 它工作正常从 dependencies
中删除 compile filetree
选项并再次重建它
dependencies {
compile 'com.android.support:appcompat-v7:22.2.1'
compile files('D:/Work_New/MyApplication/libs/mylibjar.jar')
}
- 如果还是出现这个问题,新建一个简单的工程,先将jar库导入到这个工程中。接下来将这些其他的依赖一一添加,发现problem.If问题没有再出现,将所有java文件复制到这个新项目中。接下来一个接一个的复制
"image"
个文件。通常可绘制的图像文件会导致此问题"non-zero exit value 1"
编辑:
还要在依赖项的 android{
中添加:
dexOptions {
preDexLibraries = true
}
我在使用 Java 1.8 SDK 构建我的 android 解决方案(有几个 java 模块)时也遇到了同样的错误。最后我用 Gradle Retrolamdba Plugin
修复了它将以下类路径添加到根项目的 build.gradle 文件中
classpath 'me.tatarka:gradle-retrolambda:3.2.4'
并且 retrolamdba 插件到 build.gradle 位于子 project/java 模块(jar 库)
apply plugin: 'java'
apply plugin: 'me.tatarka.retrolambda'