꿈꾸는 시스템 디자이너

Flutter 강좌 - 플랫폼간 메소드 호출 #2 - 네이티브 API 개발 | How to develop a native API using NDK 본문

Development/Flutter

Flutter 강좌 - 플랫폼간 메소드 호출 #2 - 네이티브 API 개발 | How to develop a native API using NDK

독행소년 2020. 4. 20. 14:30

 

Flutter Code Examples 강좌를 추천합니다.

  • 제 블로그에서 Flutter Code Examples 프로젝트를 시작합니다.
  • Flutter의 다양한 예제를 소스코드와 실행화면으로 제공합니다.
  • 또한 모든 예제는 Flutter Code Examples 앱을 통해 테스트 가능합니다.

Flutter Code Examples 강좌로 메뉴로 이동

Flutter Code Examples 강좌 목록 페이지로 이동

Flutter Code Examples 앱 설치 | Google Play Store로 이동

 

Flutter Code Examples - Google Play 앱

Are you a beginner at Flutter? Check out the various features of Flutter through the demo. Source code for all demos is also provided.

play.google.com


Flutter 강좌 시즌2 목록 : https://here4you.tistory.com/149

 

 

지난 강좌에서는 Android Studio가 제공하는 Native C++ 프로젝트를 통해 NDK의 동작 방식에 대해서 알아보았다.

이번 강좌에서는 그 연장선으로 안드로이드에서 호출 가능한 네이티브 API를 개발해본다.

 

지난 강좌에서 살펴본 안드로이드 프로젝트를 계속 사용한다.

 

1. 네이티브 API 추가

네이티브 API를 추가하기 위해 새로운 cpp 파일(calculator.cpp)을 app/src/main/cpp 디렉토리에 추가한다.

int addition(int a, int b) {
    return a + b;
}

int subtraction(int a, int b) {
    return a - b;
}

간단한 덧셈과 뺄셈을 제공하는 함수를 추가했다.

 

2. JNI 인터페이스 추가

기존의 native-lib.cpp 파일에 추가한 두 함수의 JNI 인터페이스를 추가한다.

#include <jni.h>
#include <string>
#include "calculator.cpp"

extern "C" JNIEXPORT jstring JNICALL
Java_com_example_ndk_1test_MainActivity_stringFromJNI(
        JNIEnv *env,
        jobject /* this */) {
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}

extern "C" JNIEXPORT jint JNICALL
Java_com_example_ndk_1test_MainActivity_addition(
        JNIEnv *env,
        jobject /* this */,
        jint a,
        jint b) {

    return addition(a, b);
}

extern "C" JNIEXPORT jint JNICALL
Java_com_example_ndk_1test_MainActivity_subtraction(
        JNIEnv *env,
        jobject /* this */,
        jint a,
        jint b) {

    return subtraction(a, b);
}

 

3. MainActivity 파일에 native 메소드 추가

MainActivity에 native 메소드를 다음과 같이 추가하고, onCreate 메소드에서 호출하는 테스트 코드를 작성한다.

package com.example.ndk_test;

import androidx.appcompat.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());

        System.out.println(" :::::::::::::::::::: ");
        int additionResult = addition(10, 5);
        System.out.println("10 + 5 = " + additionResult);

        System.out.println(" :::::::::::::::::::: ");
        int subtractionResult = subtraction(10, 5);
        System.out.println("10 - 5 = " + subtractionResult);
    }

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

    public native int addition(int a, int b);

    public native int subtraction(int a, int b);
}

 

4. 실행 결과

다음과 같이 덧셈과 뺄셈의 결과가 출력되는 성공한 것이다.

 

지금까지 두 번의 강좌를 통해 일반적인 안드로이드 프로젝트에서 네이티브 라이브러를 호출하는 방법과 네이티브 API를 추가하는 방법에 대해 알아보았다.

 

다음 강좌에서는 Android와 Flutter간 메소드 호출 방법에 대해서 알아본다.

 

Comments