3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

AndroidStudioでJavaからCをCからJavaを

3
Last updated at Posted at 2019-05-29

AndroidStudioでNDKを使っているとJavaからCを呼ぶのは簡単ですが、時々CからJavaを呼び出したくなるので覚書
(AndroidStudio 3.4.1を使用しています)
■Setp1:プロジェクト作成

2019-05-29 (1).png
AndroidStudioの「File」「New」「New Projekut」でプロジェクトを作成します。
2019-05-29 (3).png
今回はJavaからCを呼びたいので「Native C++」を選択し「Next」で次の画面に
2019-05-29 (4).png
Nameは適当に今回は「test01」
Save locationで今回作成するプロジェクトディレクトリを指定
Languageは「Java」で作成をします、設定ができたら「Next」で次の画面に
2019-05-29 (5).png
ここはただ単に「Finish」を選択します。
(この画面ではC++11とか、C++14を使う設定ができますが、後からでも設定できるので無視)
2019-05-29 (6).png
こんな画面がでたら、とりあえず、プロジェクト作成できました。
■Setp2:JavaからC

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

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

MainActivity.java
package l.toox.test01;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    // Used to load the 'native-lib' library on application startup.
    static {
        System.loadLibrary("native-lib");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Example of a call to a native method
        TextView tv = findViewById(R.id.sample_text);
        tv.setText(stringFromJNI());
    }

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

    public void testFunc(){
    }
}

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

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

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

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

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

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

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

3
3
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
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?