관리 메뉴

JHLBLUE

Android ndk 라이브러리 추가해 사용하기 본문

Android

Android ndk 라이브러리 추가해 사용하기

JHLBLUE 2017. 11. 4. 12:13

1. 새로운 프로젝트 생성 창에서 Package name 줄 밑의 Include C++ support 체크하기


2. 이후 과정은 동일, next 버튼 계속 클릭한 뒤 마지막 창에서 C++ Standard를 Toolchain Default로 선택 후 finish 클릭

3. Tools -> Android -> SDK Manager창을 연 뒤 SDK Tools 탭으로 이동, CMAKE와 NDK를 체크해 설치해준다.(ndk를 컴파일하고 실행할 도구를 설치해줘야 한다)

4. 안드로이드 프로젝트의 MainActivity.java 파일을 열어서 ndk 라이브러리를 load하는 코드와 native 함수를 선언 및 실행하는 예제코드를 확인한다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//MainActivity.java
public class MainActivity extends AppCompatActivity {
 
    static {
        System.loadLibrary("native-lib");
    }
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        TextView tv = (TextView) findViewById(R.id.sample_text);
        tv.setText(stringFromJNI());
    }
 
    public native String stringFromJNI();
}
cs




1) System.loadLibrary("native-lib"); 코드를 이용해 native-lib라는 이름의 라이브러리를 로드하는 코드이다.


2) public native String stringFromJNI(); 코드를 이용해 라이브러리에 구현된 stringFromJNI(); 함수를 사용할 수 있도록 선언한다. 이때, stringFromJNI() 함수가 반환하는 데이터의 자료형은 String이다.


1
2
3
4
5
6
7
8
9
10
11
12
//native-lib.cpp
#include <jni.h>
#include <string>
 
extern "C"
JNIEXPORT jstring JNICALL
Java_jhlblue_tistory_com_ndk_test_MainActivity_stringFromJNI(
        JNIEnv *env,
        jobject /* this */) {
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}
cs


1) JNI는 Java Native Interface의 약자로, Java Runtime과 native code가 통신할 수 있도록 기능을 제공하는 프레임워크이다.
jni.h 헤더를 추가해 ndk 작업을 할 때 필요한 타입, 구조체, 함수 등을 추가한다.

2) extern "C"는 cpp 내부에서 c언어 코드를 작성해서 컴파일 하겠다고 선언하는 코드이다.

3) JNIEXPORT 매크로를 이용해 해당 함수의 반환 자료형을 jstring으로 지정한다. 해당 코드는 안드로이드 상에서는 아무런 역할도 하지 않는, 함수의 가시성을 위해 추가하는 코드이다.

4) native code에서의 함수 이름의 규칙은 아래와 같다
* 맨 앞에 Java_ 접두사가 필요하다.
* 접두사 Java_ 다음에는 패키지 이름이 들어간다.(패키지 이름의 점은 밑줄로 대체된다)
* 패키지 이름 뒤에는 함수가 속한 자바 클래스의 이름이 들어간다.
* 클래스 이름 뒤에 함수 이름이 들어간다.



'Android' 카테고리의 다른 글

안드로이드 smali 패치하기4  (0) 2019.02.08
안드로이드 smali 패치하기3  (0) 2019.01.28
안드로이드 smali 패치하기2  (0) 2019.01.22
안드로이드 smali 패치 설명  (0) 2019.01.15
안드로이드 smali 패치하기1  (0) 2019.01.07
Comments