🐕

KotlinからJavaのコードを呼ぶ!

2024/04/10に公開

Tips💡

KotlinからJavaのコードを呼ぶことができるらしい?
本当だろうか?
ついつい気になって試してみた。といってもログを出すだけですが笑

Javaで実装したfunctionのコード

functionjavaっていうファイルを作成して、コードを書きます。Log.dと書くと、Javaのコードで、ログを出せるようです。

package com.example.fromjavarun.functionjava;

import android.util.Log;

public class Greeting {
    public String greet(String name) {
        // log hello message
        Log.d("Greeting", "Hello, " + name);
        Log.d("FromJava", "KotlinからJavaのコードを呼ぶ!!!");
        return "Hello, " + name + "!";
    }
}

Kotlinのコード

MainActivity.ktで、Javaのコードを呼び出して、KotlinからJavaのコードを読んで実行します。Javaクラスをインスタンス化して、functionを呼び出してボタンを押すと、実行することができます。

package com.example.fromjavarun

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.Button
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import com.example.fromjavarun.ui.theme.FromJavaRunTheme

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            FromJavaRunTheme {
                // A surface container using the 'background' color from the theme
                Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = MaterialTheme.colorScheme.background
                ) {
                    Greeting("Android")
                }
            }
        }
    }
}

@Composable
fun Greeting(name: String, modifier: Modifier = Modifier) {
    // JavaのGreetingクラスをインスタンス化
    val greetingJava = com.example.fromjavarun.functionjava.Greeting()

    Column(modifier = modifier) {
        Text(text = "Hello $name!")
        // Buttonを追加
         Button(onClick = {
            // greetメソッドを呼び出し
            greetingJava.greet("make app")
         }) {
            Text("Click me")
         }
    }
}

@Preview(showBackground = true)
@Composable
fun GreetingPreview() {
    FromJavaRunTheme {
        Greeting("Android")
    }
}

確認するときは、LogCatというところから確認します。 アプリをビルドして、エミュレーターに表示されているボタンを押すと、ログが表示されます。

最後に

最近、Android開発の経験があるエンジニアさんとお話して、Javaのコードをコピペして、Kotlinに変換して、使うことができることを教えてもらいました。本当にできるみたいですね。凄いな!

for文を使ってループ処理をすれば10回ログを出すロジックも作ってみました。引数を与えると、10回渡した引数の値が表示されると思います。

ループ処理するコード

package com.example.fromjavarun.functionjava;

import android.util.Log;

public class Greeting {
    public String greet(String name) {
        // for 1..10 greeting msg log
        for (int i = 1; i <= 10; i++) {
            Log.d("Greeting", "Hello " + name + "!");
        }
        return "Hello " + name + "!";
    }
}

Kotlinのコードを修正して実行

@Composable
fun Greeting(name: String, modifier: Modifier = Modifier) {
    // JavaのGreetingクラスをインスタンス化
    val greetingJava = com.example.fromjavarun.functionjava.Greeting()

    Column(modifier = modifier) {
        Text(text = "Hello $name!")
        // Buttonを追加
         Button(onClick = {
            // greetメソッドを呼び出し
            greetingJava.greet("make app")
         }) {
            Text("Click me")
         }
    }
}

Discussion