【发布时间】:2017-06-03 19:06:03
【问题描述】:
我正在使用的库是bychan,我什至不能将它包含在作为模块或通过 jar 加载的 Nougat 空应用项目中。
以下是 Android Studio 消息中返回的示例:
有人能解释一下下面错误中“未知接口”的含义吗?
Error:TokenDefinitionBuilder.java:118-119: Lambda coming from jar file need their interfaces on the classpath to be compiled, unknown interfaces are java.util.function.Function
Error:TokenDefinitionBuilder.java:118-119: Lambda coming from jar file need their interfaces on the classpath to be compiled, unknown interfaces are java.util.function.Predicate
...
Error:com.android.jack.JackAbortException
这来自我使用过的一个库。我认为在尖括号中添加类型会有所帮助吗?我不知道它是否有任何作用。
这是该库中的第 118-119 行:
strings.stream().<StringMatcher>map(StringMatcher::new).map(
m -> m.tryMatch(input, searchStart)).filter(Objects::nonNull).findFirst().orElse(null));
我不确定它在抱怨什么?我应该怎么做或改变来避免这个问题? 我原以为安卓可能不支持 Lambda 表达式,但错误中明确指出“Lambda 来自...”,这意味着它识别出我使用了 lambda 表达式。
请帮忙。
更新
如果有帮助,我已通过将其编译到另一个 jar 库中的 jar 中来包含该库。如果你不知道,我是 Android 世界的新手。
更新 2
我认为这与 API 版本无关?我已将构建目标设置为 25。但构建仍然失败。
另外,如果您看下面,我没有看到 1.8 的选项?但是我已将构建 JDK 设置为我的 1.8 JDK 位置。
分级
apply plugin: 'com.android.application'
android {
compileSdkVersion 25
buildToolsVersion "25.0.0"
defaultConfig {
applicationId "this.is.where.i.have.my.id"
minSdkVersion 25
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
jackOptions {
enabled true
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.0.1'
compile 'com.android.support:support-v4:25.0.0'
compile 'com.android.support:design:25.0.0'
compile 'com.android.support:preference-v7:25.0.0'
compile 'com.android.support:preference-v14:25.0.0'
compile 'com.google.android.gms:play-services-appindexing:9.8.0'
testCompile 'junit:junit:4.12'
compile 'com.google.code.gson:gson:2.8.0'
compile files('libs/my_lib_that_contains_lambda.jar')
}
【问题讨论】:
-
您的目标 Android API 级别是什么。应该支持API Level 23。
-
@PeterMmm 等等,我还有 21 分钟。让我尝试更新它。我只检查了 API 级别 24 支持
java.util.function.* -
很遗憾没有。我仍在使用retrolambda,而不是杰克。那里的图书馆没有问题。
-
使用 retrolambda 将 bychan 编译为 Java 7 是一个稍微有点骇人听闻的解决方法。您必须将六个接口默认方法(Lexeme 中的 5 个,Token 中的 1 个)替换为抽象方法,并在实现类中添加相应的默认实现。应该在一两个小时内完成。