从 Java 调用 Kotlin -- 错误:包 demo 不存在

Thu*_*fir 7 java oop gradle kotlin kotlin-interop

我不明白文档

\n\n
\n

包级函数

\n\n

包 org.foo.bar 内的 example.kt 文件中声明的所有函数和属性(包括扩展函数)都被编译为名为 org.foo.bar.ExampleKt 的 Java 类的静态方法。

\n
\n\n
// example.kt\npackage demo\n\nclass Foo\n\nfun bar() {\n}\n\n// Java\nnew demo.Foo();\ndemo.ExampleKt.bar();\n
Run Code Online (Sandbox Code Playgroud)\n\n

我的代码如下。

\n\n

编译错误;构建失败:

\n\n
thufir@dur:~/NetBeansProjects/kotlin$ \nthufir@dur:~/NetBeansProjects/kotlin$ gradle compileJava\n\n> Task :compileJava\n/home/thufir/NetBeansProjects/kotlin/src/main/java/net/bounceme/dur/kotlin/App.java:12: error: package demo does not exist\n        new demo.Foo();\n                ^\n/home/thufir/NetBeansProjects/kotlin/src/main/java/net/bounceme/dur/kotlin/App.java:13: error: package demo does not exist\n        demo.ExampleKt.bar();\n            ^\n2 errors\n\n\nFAILURE: Build failed with an exception.\n\n* What went wrong:\nExecution failed for task \':compileJava\'.\n> Compilation failed; see the compiler error output for details.\n\n* Try:\nRun with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.\n\n* Get more help at https://help.gradle.org\n\nBUILD FAILED in 0s\n1 actionable task: 1 executed\nthufir@dur:~/NetBeansProjects/kotlin$ \n
Run Code Online (Sandbox Code Playgroud)\n\n

java源:

\n\n
package net.bounceme.dur.kotlin;\n\nimport java.util.logging.Logger;\n\npublic class App {\n\n    private static final Logger LOG = Logger.getLogger(App.class.getName());\n\n    private void run() {\n        LOG.info("running");\n\n        new demo.Foo();\n        demo.ExampleKt.bar();\n\n    }\n\n    public static void main(String[] args) {\n        new App().run();\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

科特林来源:

\n\n
package demo;\n\nclass Foo\n\nfun bar() {\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

项目:

\n\n
thufir@dur:~/NetBeansProjects/kotlin$ \nthufir@dur:~/NetBeansProjects/kotlin$ tree\n.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 build\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 classes\n\xe2\x94\x82   \xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 java\n\xe2\x94\x82   \xe2\x94\x82       \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 main\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 tmp\n\xe2\x94\x82       \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 compileJava\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 build.gradle\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 gradle\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 wrapper\n\xe2\x94\x82       \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 gradle-wrapper.jar\n\xe2\x94\x82       \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 gradle-wrapper.properties\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 gradlew\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 gradlew.bat\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 settings.gradle\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 src\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 main\n    \xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 java\n    \xe2\x94\x82   \xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 net\n    \xe2\x94\x82   \xe2\x94\x82       \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 bounceme\n    \xe2\x94\x82   \xe2\x94\x82           \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 dur\n    \xe2\x94\x82   \xe2\x94\x82               \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 kotlin\n    \xe2\x94\x82   \xe2\x94\x82                   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 App.java\n    \xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 kotlin\n    \xe2\x94\x82       \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 example.kt\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 test\n        \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 java\n            \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 AppTest.java\n\n18 directories, 9 files\nthufir@dur:~/NetBeansProjects/kotlin$ \n
Run Code Online (Sandbox Code Playgroud)\n

m.s*_*d.s 13

在你的 build.gradle (模块)中使用它:

apply plugin: 'kotlin-android'
Run Code Online (Sandbox Code Playgroud)


小智 8

  1. 确保您在 Android Studio 中安装了 Kotlin 插件
  2. 将 Kotlin 添加到项目文件中的类路径中gradle.build
         dependencies {
            classpath "com.android.tools.build:gradle:4.1.2"
            classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.21"
            classpath "org.jetbrains.kotlin:kotlin-android-extensions:1.4.21"
            // NOTE: Do not place your application dependencies here; they belong
            // in the individual module build.gradle files
        }
Run Code Online (Sandbox Code Playgroud)
  1. 在您的模块(应用程序)上应用 kotlin-android 插件,gradle.build如下所示:

    plugins {
        id 'com.android.application'
        id 'kotlin-android'
    }
    
    Run Code Online (Sandbox Code Playgroud)


Xav*_*let 0

demo 文件夹应该位于 src/main/kotlin 下,其下有 example.kt。

所以应该是 src/main/kotlin/demo/example.kt

[编辑] 不需要匹配目录和包:源文件可以任意放置在文件系统中。

[edit2]我做了一个有效的例子:

Java代码

package test;

import demo.HelloWorldKt;

 public class Test {
    public static void main(String[] args) {
       ExampleKt.bar();
    }
}
Run Code Online (Sandbox Code Playgroud)

科特林代码:

package demo

fun bar() {
    println("yeah")
}
Run Code Online (Sandbox Code Playgroud)

其中kotlin文件是直接在src/main/kotlin下的helloWrold.kt

您的 java 文件中似乎缺少 kotlin 文件的导入。