LoginSignup
5
5

More than 3 years have passed since last update.

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

Posted at

せっかく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
デバッグ実行でブレークもはれます。

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5