티스토리 뷰

Android/JNI, AIDL

[NDK] JNI 초급

이주성 2012. 12. 27. 18:10

NDK를 이용한 JNI 짜보기

아~~ framework 소스에서 jni를 하다가 NDK로 jni를 하려니 죽겠군... NDK를 이용한 JNI는 좀 틀리다. 아니.. 많이 틀리다. 오늘은 첫시간으로 NDK를 이용한 JNI 테스트 프로그램을 간단하게 짜보자.

package com.example.hellojni;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;

public class HelloJni extends Activity {
    private static final String TAG = "HelloJni";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_hello_jni);
        Log.v(TAG, "str = " + stringFromJNI());
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_hello_jni, menu);
        return true;
    }
    
    public native String stringFromJNI();
    
    static {
        System.loadLibrary("hello-jni");
    }
}

JNI Header 파일 

편하게 하려면 java파일에서 header파일을 추출하면된다. 

해당 프로젝트의 폴더의 /bin/classes폴더로 이동합니다. 다음 커맨드 라인 명령어를 통해서 jni header를 추출합니다.

javah -jni com.example.hellojni.HelloJni

생성되는 .h파일은 명령어를 실행한 폴더에 만들어지며, 이름은 packageName + class파일이름이기 때문에 이예제의 경우는 com_example_hellojni_HelloJNI.h로 만들어 집니다. 편의를 위해 HelloJni.h로 rename 해줍시다

그러나 JNI Header파일을 쓰면 복잡한 JNI를 할때는 좀 힘들다.. 이때는 고급 JNI로서 JNI_OnLoad, registerNativeMethods를 사용하여 methods를 직접 등록하는 방법을 쓴다. 


header파일 기준으로 native 코드를 작성

에러를 줄이려면 JNI header파일에서 함수 정의부분을 그냥 가져와서 써라..

#include <assert.h> #include <jni.h> #include <android/log.h> #include "HelloJni.h" #define TAG "hello" #define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, TAG, __VA_ARGS__) #include <android/native_window_jni.h> jstring Java_com_example_hellojni_HelloJni_stringFromJNI (JNIEnv* env, jobject object) { LOGV("Java_com_example_hellojni_HelloJni_stringFromJNI"); return (*env)->NewStringUTF(env, "hello"); }


P.S : 여기처럼 #include <android/log.h>를 하면 추가로 #define LOGV(...)를 해서 써야 한다. NDK JNI고급에 첨부한 log.h를 복사해서 #define없이 써라.

Library compile을 위한 Android.mk를 만들기
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := hello-jni
LOCAL_SRC_FILES := hello-jni.c
LOCAL_LDLIBS    += -llog 
LOCAL_LDLIBS 	+= -landroid

include $(BUILD_SHARED_LIBRARY)

native와 관련된 파일들을 프로젝트의 jni폴더를 만들어 복사

native관련 파일들은 HelloJni.h, HelloJni.c, Android.mk 3개입니다.

Library compile

jni폴더로 이동하여 ndk-build를 실행해 줍니다. 결과물은 libs/armeabi/libhellojni.so로 저장이됩니다.

이제 실행해봅시다.

'Android > JNI, AIDL' 카테고리의 다른 글

Secure Sharing a Service between two application  (0) 2013.08.19
Remote Service using AIDL  (0) 2013.06.04
Android Service  (0) 2013.01.21
[NDK] JNI 고급  (0) 2012.12.28
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함