Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

AndroidStudioでKotlinからCをCからKotlinを

More than 1 year has passed since last update.

せっかくJavaからKotlinにうつったので、Cを使う

■Setp1:プロジェクト作成。

2019-05-30 (10).png
「File」「New」「New Project」かプロジェクト作成に入ります。
2019-05-30 (11).png
Cを使うので「Native C++」を選択してから「Next」を
2019-05-30 (12).png
今回はNameを「test01」に
Save locationは作業ディレクトリーを
Languageは「Kotlin」を設定して「Next」を
2019-05-30 (13).png
最後「Finish」を選択して
2019-05-30 (14).png
こんな画面が出たら完成

■Setp2:KotlinからC

プロジェクト作成した時点で、KotlinからCを呼び出すソースになっています。
実行すれば「MainActivity.kt」のなかから「stringFromJNI()」をよんでいるので、native-lib.cppの「Java_l_toox_test01_MainActivity_stringFromJNI」が呼ばれています。
(細かい話は、別途勉強しましょう)

■Setp3:CからKotlin

[MainActivity.kt]にCから呼ばれる関数「testFunc」を追加します。

MainActivity.kt
package l.toox.test01

import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // Example of a call to a native method
        sample_text.text = stringFromJNI()
    }

    /**
     * A native method that is implemented by the 'native-lib' native library,
     * which is packaged with this application.
     */
    external fun stringFromJNI(): String

    companion object {

        // Used to load the 'native-lib' library on application startup.
        init {
            System.loadLibrary("native-lib")
        }
        @JvmStatic
        fun testFunc(){
        }
    }
}

呼ばれる「testFunc」は「compaion object」の中に必要なので注意です。

    companion object {
          :
        @JvmStatic
        fun testFunc(){
        }
    }

次にCからKotlinを読みだす部分。[Native-lib.cpp]を以下のように修正します。

Native-lib.cpp
#include <jni.h>
#include <string>

extern "C" JNIEXPORT jstring JNICALL
Java_l_toox_test01_MainActivity_stringFromJNI(
        JNIEnv *env,
        jobject in_thiz) {

    jobject my_class = env->NewGlobalRef(in_thiz);
    jclass clazz = env->GetObjectClass(my_class);
    jmethodID mobj = env->GetStaticMethodID( clazz, "testFunc", "()V" );
    env->CallStaticVoidMethod( clazz, mobj );
    env->DeleteLocalRef( clazz );

    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}

「AndroidStudioでJavaからCをCからJavaを」の時と、少し呼び出し関数が変わっているので注意
https://qiita.com/sanoh/items/ef0b99fc1dd2f1484d7a

(引数が jobject in_thiz となっている事を注意してください。)

これで実行すればCからKotlinを呼び出しています。
2019-05-30 (17).png
デバッグ実行でブレークもはれます。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away