JNI를 이용해 C를 호출 할 때, Java 쪽에는 아래의 사항을 지켜야 한다.

  • 호출하는 함수에는 native를 붙인다.
  • loadLibrary()를 이용해서 호출할 라이브러리를 지정한다.(NDK를 이용해서 빌드될 라이브러리)

그리고 C/C++에서는 아래의 사항을 지켜야 한다.

  • 함수명은 Java로 시작하며, 패키지명, 클래스명, 메소드명을 순서대로 적는다.
  • 처음의 2개 인자는 JNIEnv 타입과 jobject 타입으로 해야한다. 이후에 오는 인자들은 Java와 C/C++에서 1:1로 매칭되는 parameter들이다.

 

예시

public class MainActivity extends Activity {

    public native int add(int a, int b); //'native'가 제일 중요
    
    static {
        System.loadLibrary("calc");
    }
}

Java 코드는 위와 같이 add 함수 앞에 'native'가 붙어 있다.

 

#include <JNI.H>
jint Java_kr_jhb_calcwidget_MainActivity_add(JNIEnv* env, jobject thiz, jint a, jint b)
{
	return a+b;
}

C코드는

jint Java_kr_jhb_calcwidget_MainActivity_add(JNIEnv* env, jobject thiz, jint a, jint b) 인데, 순서대로

반환타입 / Java / 패키지명 / 클래스명 / 메소드명 / 인자(JNIEnv* / jobject / parameters...) 인 것을 볼 수 있다.

 

JNIEnv에는 JNI의 환경 정보가 들어있다. env 변수를 통해 자바 측 실행 정보를 취득해 설정한다.

jobject에는 이 함수가 포함된 클래스의 정보가 들어있다.(위의 경우 MainActivity의 인스턴스 정보가 포함돼 있음)

 

 

 

 

 

 

 

저작자 표시 비영리 변경 금지
신고
블로그 이미지

roter

JHB / Peripheral Programmer

댓글을 달아 주세요