티스토리 뷰
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 |