首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Android和JVM目标(与Kotlin多平台)之间共享Java代码?

如何在Android和JVM目标(与Kotlin多平台)之间共享Java代码?
EN

Stack Overflow用户
提问于 2019-12-25 13:50:32
回答 1查看 1.9K关注 0票数 9

我试图使用Kotlin多平台特性在Android和JVM目标之间共享Java代码(示例项目:https://github.com/dmitrykolesnikovich/accessJavaCode-issue)

简单地说,“:library1 1”和“:library1 2”都是针对JVM和Android的Kotlin多平台库。“:图书2”取决于“:图书1”。他们都使用Kotlin和Java。“:library2 2”是指1) Android应用程序和2)桌面(JavaFX)应用程序的依赖关系。这就是为什么1) AAR工件和2) JAR工件都需要(?) -所以我使用了1) Android目标和2) JVM目标,用于“:library2 1”和“:library2 2”。

问题是,当我在“:library1 1”中有Java代码时

代码语言:javascript
复制
public class JavaCode {} // JavaCode.java

和Kotlin代码在“:library1 2”中依赖于“:library1 1”

代码语言:javascript
复制
class AccessJavaCode : JavaCode() // AccessJavaCode.kt

Android目标可以识别Java,但JVM目标不是:

代码语言:javascript
复制
> Task :library2:compileKotlinJvm FAILED
e: AccessJavaCode.kt: (3, 38): Unresolved reference: JavaCode

在gradle配置中,我定义了两个插件:kotlin-multiplatformcom.android.library

代码语言:javascript
复制
apply plugin: "kotlin-multiplatform"
apply plugin: "com.android.library"

kotlin {
    targets {
        jvm()
        android()
    }
    sourceSets {
        jvmMain {
            dependencies {
                api kotlin("stdlib-common")
                api kotlin("stdlib-jdk8")            
            }
        }
        androidMain {
            dependsOn jvmMain
        }
    }
}

android {
    compileSdkVersion 28
    sourceSets {
        main {
            java.srcDirs += "src/jvmMain/kotlin" // Android target recognizes Java with this
            manifest.srcFile "src/androidMain/AndroidManifest.xml"
        }
    }
}

我很确定这是一个简单的与我的梯度文件。非常感谢你们的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-02 01:41:19

编辑

另一个解决问题的方法是,在不丧失为library1生成android存档.aar的能力的情况下,根据原始library1的分裂版本的预编译伪件,为同一库制作一个新版本。

因此,您将得到一个多模块的gradle项目,如下所示:

  • 启用java插件的library1 1-jvm
  • 库1-启用android插件的android
  • library1,它将依赖于预先构建的库1-jvm.jar和库1-android.aar。

您可以使用您喜欢的任何东西来发布这些工艺品,但是local maven repo应该工作得很好!

这将意味着取代:

代码语言:javascript
复制
kotlin {
    targets {
        jvm()
        android()
    }
    sourceSets {
        jvmMain {
            dependencies {
                 api kotlin("stdlib-common")
                 api kotlin("stdlib-jdk8")
            }
        }
        androidMain {
            dependsOn jvmMain
        }
    }
}

通过以下方式:

代码语言:javascript
复制
kotlin {
    targets {
        jvm()
        android()
    }
    sourceSets {
        jvmMain {
            dependencies {
                api kotlin("stdlib-common")
                api kotlin("stdlib-jdk8")
                api "com.company:library-jvm:1.0.0" 
            }
        }
        androidMain {
            dependsOn jvmMain
            dependencies {
                api "com.company:library-android:1.0.0"
            }
        }
    }
}

这样,在最终的library1中根本不需要java插件,因为所有的java代码都将在一个单独的步骤中构建。

因此,library1可以同时保留JVMAndroid目标

~

为了解决问题,您需要:

  • 拆分您的build.gradle配置以使每个库有一个配置,这将是必要的,因为您不能同时为同一个Gradle项目启用java插件和android,否则您将得到以下Error: The 'java' plugin has been applied, but it is not compatible with the Android plugins
  • 如果您希望JVM目标识别您的library1源文件,请在您的library1项目中启用java插件。
  • Java源文件需要放置在java源根的同级目录kotlin中。

更多信息:java-支持jvm-目标的Kotlin文档

我还创建了一个拉请求来解决您的问题。

这种方法的缺点是您无法为.aar生成一个library1存档.jar,但是我想在您的library1项目中使用.jar不应该是一个问题。

library1/build.gradle:

代码语言:javascript
复制
apply plugin: "kotlin-multiplatform"

kotlin {
    jvm {
        withJava()
    }

    sourceSets {
        jvmMain {
            dependencies {
                api kotlin("stdlib-common")
                api kotlin("stdlib-jdk8")
            }
        }
    }
}

library2/build.gradle:

代码语言:javascript
复制
apply plugin: "kotlin-multiplatform"
apply plugin: "com.android.library"

kotlin{
    jvm()
    android()

    sourceSets {
        jvmMain.dependencies {
            api project(":library1")
        }
        androidMain {
            dependsOn jvmMain
        }
    }
}

android {
    compileSdkVersion 28
    sourceSets {
        main {
             java.srcDirs += "src/jvmMain/kotlin"
             manifest.srcFile "src/androidMain/AndroidManifest.xml"
        }
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59479020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档