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


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

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


「File」「New」「New Project」かプロジェクト作成に入ります。

Cを使うので「Native C++」を選択してから「Next」を

今回はNameを「test01」に
Save locationは作業ディレクトリーを
Languageは「Kotlin」を設定して「Next」を

最後「Finish」を選択して

こんな画面が出たら完成

■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を呼び出しています。

デバッグ実行でブレークもはれます。