Hyeyeon blog

[Android] JNI를 이용해 안드로이드에서 c파일 사용하기 본문

개발/Android

[Android] JNI를 이용해 안드로이드에서 c파일 사용하기

Hyeyeon.P 2021. 2. 1. 18:55
반응형

 

1. NDK 설치

- Preferences > System Settings > Android SDK > SDK Tools > NDK 설치

2. External Tool 생성

- Preferences > Tools > External Tools > + 버튼을 클릭하여 Tool 생성

Name: ndk-build 
Description: .so 파일 생성
Program: ndk-build 위치
  - File > SDK Location > Android NDK location 과 동일하게 작성 
Arguments : (공백) 
Working directory: 현재 프로젝트의 jni 폴더 위치 

3. src/main/jni 폴더 생성 후 하위에 각 파일 생성

(1) Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := test-jni		<<  Java에서 호출할 모듈 명 (원하는 명으로 지정)
LOCAL_SRC_FILES := test-jni.c		<<  c 파일 명  
include $(BUILD_SHARED_LIBRARY)

(2) Application.mk

APP_ABI := all

(3) test-jni.c

#include <jni.h>
JNIEXPORT jsting JNICALL Java_com_example_demo_MainActivity_getText(JNIEnv *env, jobject thiz){
    return (*env)->NewStringUTF(env, "Hello JNI");
}

4. .so파일 생성

    - MainActivit 우측 마우스 버튼 클릭 > External Tools > ndk-build 선택
    - src/main/libs에 .so파일이 생성됨

5. build.gradle(Moduel: app)

android { 
   sourceSets.main{
      jniLibs.srcDir 'src/main/libs'   // .so파일 위치 지정 
   }

    packagingOptions {
      pickFirst '**/*.so'    
   }
}

6. 호출하기

(1) Kotlin

MainActivity : AppCompatActivity() {
   companion object {
    @JvmStatic 
    external fun getText() : String

    @JvmStatic 
    fun load(){
      System.loadLibrary("test-jni")
    }
  }

  init {
     // 앱 실행 시 로드 
     load()
  }

  override fun onCreate (...) {
    .. 
    val text = getText() // Hello JNI
  }

}

(2) Java

class MainActivity extends AppCompatActivity() {
   public native String getText();
   
   @Override
   protected void onCreate(@Nullable Bundle savedInstanceState) {
    ..
    
    load();
    String text = getText(); // Hello JNI
  }
  
  public static void load(){
    System.loadLibrary("test-jni")
  }
}

 

관련 글

>> [Android] JNI에서 사용되는 문법 정리

728x90
Comments