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.");
        }
    }

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

相关推荐
QQ_21696290961 小时前
【项目编号:project95315】SpringBoot公共自习室管理系统:座位预约、房间管理、签到核销、公告规则完整实战
java·spring boot·后端
xcLeigh1 小时前
Go入门:基本数据类型全览与选择指南
android·服务器·golang·教程·go热门
alexhilton2 小时前
规范驱动开发:让AI生成符合预期的KMP代码
android·kotlin·android jetpack
嵌入式阿蔡2 小时前
面试高频考点 01:volatile / 中断 / 堆栈 八股精讲
java·面试·职场和发展·嵌入式实时数据库
码农coding2 小时前
android12 ActivityManagerService开机启动分析
android
秋饼2 小时前
LangChain4j + Java 实现企业级 Text-to-SQL 智能问数系统:从自然语言到安全可控的数据洞察
java·ai·技术分享·后端开发
Escalating_xu2 小时前
【C++ STL简介】从六大组件到容器、迭代器与算法协作
java·c++·算法
何以解忧,唯有..2 小时前
Python os模块详解:文件与目录操作指南
java·服务器·python
Csxyzj2 小时前
kubernetes集群部署方法
java·linux·kubernetes
SQL-First布道者3 小时前
全面解构传统持久层框架,拥抱真正的 SQL-First
java·数据库·spring boot·sql·spring·mybatis·spring jdbc