Android Studio 中 Java 调用 Kotlin 代码的两种入口实现,包含环境配置。安卓开发的 app 和纯代码的 main 两种入口

背景信息

  • 开发背景

    笔者基于 Kotlin 开发头戴设备部署 AI 模型的时候,所参照的示例普遍也基于 Kotlin 实现,之所以出现 Java 和 Kotlin 要互相调用的情况,是因为要适配相对成熟的 Java for Android 开发。

    前辈们已经为此目的铺好了路,所以这里分享完整的互相调用的示例,而不是只呈现核心代码或注意事项的情况。同时非常感谢公司对笔者研发的支持,给予了足够的耐心让笔者向网上的前辈学习,希望能够在解决一个个的问题中,早日为公司的边缘端设备赋能 AI,而且稳定又好用。

  • 开发环境

    Android Studio Narwhal | 2025.1.1 Patch 1

app 入口

  1. build.gradle.kts 的配置没有什么特殊要求,笔者是沿着 Android Studio 所创建的Empty模板而完成的本文。如果计划将kotlin/java所开发的代码作为模块导入,则在dependencies块中加入如下类似的配置即可。

    KotlinForJava是笔者创建的模块名

    gradle 复制代码
    implementation(project(":KotlinForJava"))
  2. app\src\main\res\activity_main.xml

    xml 复制代码
    <?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
    
        <TextView
            android:id="@+id/myTextView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hello World!"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    
    </androidx.constraintlayout.widget.ConstraintLayout>
  3. MainActivity.java

    注意,此处Detector的实例化是从模块中导入的

    java 复制代码
    package com.example.javacallkotlinpurecode;
    
    import androidx.appcompat.app.AppCompatActivity;
    
    import android.os.Bundle;
    import android.util.Log;
    import android.widget.TextView;
    
    import com.example.kotlinforjava.purecode.Detector;
    
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            TextView myTextView = findViewById(R.id.myTextView);
    
            Detector detector = new Detector();
            String message = detector.detect();
    
            MyKotlinUtils tester = new MyKotlinUtils();
            String testerMsg = tester.greetingFromKotlin();
    
            myTextView.setText(message);
            Log.i("JAVA Caller", testerMsg);
        }
    }
  4. MyKotlinUtils.kt

    注意本代码同 MainActivity.java是同在app\src\main\java\com\example\javacallkotlinpurecode目录下

    kotlin 复制代码
    package com.example.javacallkotlinpurecode
    
    class MyKotlinUtils {
        fun greetingFromKotlin(): String {
            return "Hello form Kotlin in the same directory level!"
        }
    }

此时 Android Studio 在MainActivity.javamain方法处应该就有一个绿色的运行按钮了。
3.

main 入口

在 Android Studio 中,笔者实现的是以模块的形式运行纯代码

  1. build.gradle.kts

    重点是id("java-library"),其意思为构建一个纯 Java 库

    gradle 复制代码
    plugins {
        id("java-library")
        alias(libs.plugins.jetbrains.kotlin.jvm)
    }
    java {
        sourceCompatibility = JavaVersion.VERSION_11
        targetCompatibility = JavaVersion.VERSION_11
    }
    kotlin {
        compilerOptions {
            jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_11
        }
    }
  2. Detector.kt

    kotlin 复制代码
    package com.example.kotlinforjava.purecode
    
    class Detector() {
        fun detect(): String {
            return "Kotlin: Aloha!!"
        }
    }
  3. Main.java

    java 复制代码
    package com.example.kotlinforjava.purecode;
    
    public class Main {
        public static void main(String[] args) {
            System.out.println("Java main method started.");
    
            Detector detector = new Detector();
    
            System.out.println(detector.detect());
    
            System.out.println("Java main method finished.");
        }
    }

    此时就可以看到如下的输出了

相关推荐
青云计划10 小时前
知光项目知文发布模块
java·后端·spring·mybatis
赶路人儿10 小时前
Jsoniter(java版本)使用介绍
java·开发语言
冬奇Lab10 小时前
Android系统启动流程深度解析:从Bootloader到Zygote的完整旅程
android·源码阅读
探路者继续奋斗11 小时前
IDD意图驱动开发之意图规格说明书
java·规格说明书·开发规范·意图驱动开发·idd
消失的旧时光-194311 小时前
第十九课:为什么要引入消息队列?——异步系统设计思想
java·开发语言
A懿轩A11 小时前
【Java 基础编程】Java 面向对象入门:类与对象、构造器、this 关键字,小白也能写 OOP
java·开发语言
泓博12 小时前
Android中仿照View selector自定义Compose Button
android·vue.js·elementui
乐观勇敢坚强的老彭12 小时前
c++寒假营day03
java·开发语言·c++
biubiubiu070612 小时前
谷歌浏览器无法访问localhost:8080
java
大黄说说12 小时前
新手选语言不再纠结:Java、Python、Go、JavaScript 四大热门语言全景对比与学习路线建议
java·python·golang