45
app_process & JNI 송형주 송형주

안드로이드 스터디 Jni 발표 자료 Rev05 송형주

  • Upload
    iamhjoo-

  • View
    19.601

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 안드로이드 스터디 Jni 발표 자료 Rev05 송형주

app_process & JNI

송형주송형주

Page 2: 안드로이드 스터디 Jni 발표 자료 Rev05 송형주

ContentsContents

• 1. Zygote의 전체 동작 Flow

• 2 Android와 JNI2. Android와 JNI

– 2.1 JNI란?

2 2 J 에서 C라이브러리 사용– 2.2 Java에서 C라이브러리 사용

– 2.3 C에서 자바 클래스 사용

– 2.4 네이티브 함수 등록

– 2 5 NDK2.5 NDK

• 3. app_process 동작 원리

Page 3: 안드로이드 스터디 Jni 발표 자료 Rev05 송형주

1. ZYGOTE 전체 동작 FLOW

Page 4: 안드로이드 스터디 Jni 발표 자료 Rev05 송형주

Zygote의 전체 동작 Flowinit 프로세스

service_manager 프로세스

app_process 프로세스

DVM 및 Runtime

ZygoteInit

System Server 프로세스

각종 Service 실행

Page 5: 안드로이드 스터디 Jni 발표 자료 Rev05 송형주

2. ANDROID와 JNI

Page 6: 안드로이드 스터디 Jni 발표 자료 Rev05 송형주

Java Side

JNIJNI

C/C++ Side

Page 7: 안드로이드 스터디 Jni 발표 자료 Rev05 송형주

왜 안드로이드에서 JNI를 알아야 하나?왜 안드로이드에서 JNI를 알아야 하나?

안드로이드 프레임워크의 구조를 제대로 이해하기• 안드로이드 프레임워크의 구조를 제대로 이해하기위해서

안드로이드는 J 와 C/C++로 이루어진 프레임워크– 안드로이드는 Java와 C/C++로 이루어진 프레임워크

– Java와 C/C++ 모듈을 연결해주는 매개체가 바로 JNI (Java Native Interface)이다(Java Native Interface)이다.

• 안드로이드의 새로운 기능을 추가하고자 할때안드로이드의 새로운 기능을 추가하고자 할때– 기존 C/C++ 코드의 재활용

– 새로운 서비스 추가서 추• (ex 리눅스 디바이스 드라이버 프로그래밍)

Page 8: 안드로이드 스터디 Jni 발표 자료 Rev05 송형주

왜 JNI를 사용하는가?왜 JNI를 사용하는가?

1 속도 문제가 있는 계산 루틴• 1. 속도 문제가 있는 계산 루틴자바가 Native Code(플랫폼에 종속적인 기계어 코드)에비해 느리다.

• 2. 자바에서 하드웨어 제어를 하지 못함.

• 3. 자바에서 지원되지 않은 특정 운영체제 서비스자바의 클래스 라이브러리는 방대하고 다양한 서비스를 제공하지만, 특정플랫폼에서 제공하는 고유의 서비스의 기능을 모두 포함할 수는 없다 특히플랫폼에서 제공하는 고유의 서비스의 기능을 모두 포함할 수는 없다. 특히, 특수한 목적으로 제작된 하드웨어를 자바에서 제어해야 할 필요가 있다고한다면, 자바만으로 해결하기는 힘들다.

• 4. 기존의 프로그램(C/C++)에서 자바가 제공하는 서비스를 이용기존에 작성된 프로그램이나 기존의 시스템(legacy)과의 연계 문제기존에 작성된 프로그램이나 기존의 시스템(legacy)과의 연계 문제

Page 9: 안드로이드 스터디 Jni 발표 자료 Rev05 송형주

What is JNI(Java Native Interface)?What is JNI(Java Native Interface)?

자바와 자바 이외의 언어로 만들어진 애플리케이션이나 라이브러리가 상호자바와 자바 이외의 언어로 만들어진 애플리케이션이나 라이브러리가 상호작용할 수 있도록 연결시켜 주는 인터페이스

Page 10: 안드로이드 스터디 Jni 발표 자료 Rev05 송형주

Calling C/C++ code from Java programsCalling C/C code from Java programs

H ll J iClHelloJniClassClass

native Hello() native 메서드 선언

Java Virtual Machine

S l dllJava_HelloJNI_Hello() native 메서드 구현

(JVM이 식별가능하도록 nativeSample.dll

해당 DLL 파일은 J Vi t l M hi 이 인식할 수 있도록

( 이 식별가능하 록method 이름이 정의됨.)

해당 DLL 파일은 Java Virtual Machine이 인식할 수 있도록만들어져야 한다.

Page 11: 안드로이드 스터디 Jni 발표 자료 Rev05 송형주

구현 순서구현 순서

Page 12: 안드로이드 스터디 Jni 발표 자료 Rev05 송형주

Step 1: Write the Java CodeStep 1: Write the Java Code

Page 13: 안드로이드 스터디 Jni 발표 자료 Rev05 송형주

Step 2: Compile the Java CodeStep 2: Compile the Java Code

Page 14: 안드로이드 스터디 Jni 발표 자료 Rev05 송형주

Step 3: Create the h FileStep 3: Create the .h File

javah 명령어 이용

Page 15: 안드로이드 스터디 Jni 발표 자료 Rev05 송형주

Step3 결과Step3 결과

Page 16: 안드로이드 스터디 Jni 발표 자료 Rev05 송형주

Step 4: Write the Native Method Implementation

Page 17: 안드로이드 스터디 Jni 발표 자료 Rev05 송형주

Step5 Create DLLStep5. Create DLL

cl -I"C:\Program Files\Java\jdk1.6.0_14\include" -I"C:\Program Files\Java\jdk1.6.0_14\include\win32" -LD HelloC.c -FeHelloC.dll

• cl : visual c++ 컴파일 명령어

• I : include 시킬 헤더 파일 경로• ‐I : include 시킬 헤더 파일 경로

– jni.h (C:\Program Files\Java\jdk1.6.0_14\include)– jni_md.h (C:\Program Files\Java\jdk1.6.0_14\include\win32)

• ‐LD : DLL을 만든다.• ‐Fe<파일명> : 생성할 파일 이름을 지정.

Page 18: 안드로이드 스터디 Jni 발표 자료 Rev05 송형주

Step5 결과

Page 19: 안드로이드 스터디 Jni 발표 자료 Rev05 송형주

Step 6: Run the ProgramStep 6: Run the Program

Page 20: 안드로이드 스터디 Jni 발표 자료 Rev05 송형주

응용응용• 그렇다면 기존 DLL의 경우는 JNI 인터페이스에 맞게 다시 DLL을 만

들어줘야 하나??

HelloJNI Class

native OldHello() native 메서드 선언

Java Virtual Machine

H ll C dllJava_HelloJNI_OldHello()

OldH ll C dllOldHello()

기존 DLL 파일JNI 가능한 DLL 파일

HelloC.dll OldHelloC.dll

Page 21: 안드로이드 스터디 Jni 발표 자료 Rev05 송형주

Calling Java code from C/C++ Programs

• C/C++ 애플리케이션에서 Java 클래스의 메서드를 호출할 수 있나?– 어찌됐건 Java 클래스의 메서드를 실행하기 위해서는

Java Virtual Machine이 필요함.

• Native 애플리케이션 영역내에 JVM을 로딩할 필영 딩요가 있는가?– 자바 애플릿을 처리하는 웹브라우저 애플리케이션의자바 애플릿을 처리하는 웹 라우저 애플리케이션의

경우

Page 22: 안드로이드 스터디 Jni 발표 자료 Rev05 송형주

Calling Java code from C/C++ ProgramsCalling Java code from C/C++ Programs

Hello Class

Hello()

2. 클래스 로딩3. 메서드 실행

Java Virtual Machine

1 JVM 로딩 (JNI invokation API 이용)

C/C ++ Native Code

1. JVM 로딩 (JNI invokation API 이용)

Page 23: 안드로이드 스터디 Jni 발표 자료 Rev05 송형주

로딩할 Java 클래스 코드 작성로딩할 Java 클래스 코드 작성

Page 24: 안드로이드 스터디 Jni 발표 자료 Rev05 송형주

Java 클래스를 호출할 C 애플리케이션 작성Java 클래스를 호출할 C 애플리케이션 작성

Page 25: 안드로이드 스터디 Jni 발표 자료 Rev05 송형주

실행 결과실행 결과

Page 26: 안드로이드 스터디 Jni 발표 자료 Rev05 송형주

Register Native MethodsRegister Native Methods

자바 프로그래머• 자바 프로그래머– 1. System.load 함수 이용 : native 라이브러리 로딩– 2 VM이 자바의 네이티브 메소드를 로딩한 라이브러– 2. VM이 자바의 네이티브 메소드를 로딩한 라이브러

리의 native 함수로 연결

• C 프로그래머– RegisterNatives (JNI API 이용)

네이티브 함수 코드를 클래스의 ti 메서드에 연결– 네이티브 함수 코드를 클래스의 native 메서드에 연결가능

– VM이 링크하는 것보다 훨씬 능률적이고 빠름.– VM을 포함하고 있는 C 프로그램에서 C 자체의 native

함수를

Page 27: 안드로이드 스터디 Jni 발표 자료 Rev05 송형주

Register Native Method 개념Register Native Method 개념

native native0(String msg ) Java_Test_native0

natvie native1( ) fuction mappting table

java virtual machine

Java_Test_native1

Test 클래스C Application(DLL 형태 아님)

RegisterNative 함수 이용.(JVM에 native funcation을 링크시킴)

Page 28: 안드로이드 스터디 Jni 발표 자료 Rev05 송형주

RegisterNatives 함수RegisterNatives 함수

JNIN ti M th d 구조체• JNINativeMethod 구조체

typedef struct {char *name;  // Name of native methodchar  name;  // Name of native methodchar *signature; // JNI method signaturevoid *fnPtr; // Addr. of native method impl.

} JNINativeMethod

• RegisterNatives 함수jint RegisterNatives(JNIEnv *env, 

jclass clazz,const JNINativeMethod *methods,ji t  M th d )jint nMethods);

• clazz 인수에 의해 지정된 클래스의 네이티브 메소드를 등록합니다.• methods 파라미터는, 그 네이티브 메소드의 이름, 시그니처, 함수 포인

터를 포함한 JNINativeMethod 구조체의 배열을 지정합니다. • nMethods 파라미터는, 배열내의 네이티브 메소드의 수를 지정합니다.

Page 29: 안드로이드 스터디 Jni 발표 자료 Rev05 송형주

Android JNI Help 함수Android JNI Help 함수

Page 30: 안드로이드 스터디 Jni 발표 자료 Rev05 송형주

JNI OnloadJNI_Onload

Wh J l ith ti th d i l d d it h• When a Java class with native methods is loaded, it has no “wiring” to the native classes until System.loadLibrary("NativeLibName") is called. If it is exported by the library, JNIOnLoad is called first After that the JVM tries to map libr_OnLoad is called first. After that, the JVM tries to map libr

ary symbols to native methods.

JNI O L d i th f t t if th i i• JNI_OnLoad is there for two reasons: to specify the minimum JNI version needed by the library and to perform library initialization. If it’s not present in your library, the JVM will assume that it’s only compliant with the minimum JNI verl assume that it s only compliant with the minimum JNI version, 1.1.

• It may seem unnecessary to export JNI_OnLoad from your library if you don’t have anything to initialize.

Page 31: 안드로이드 스터디 Jni 발표 자료 Rev05 송형주

JNI_Onload (사용예) libandroid servers solibandroid_servers.so

LOCAL_SRC_FILES:= \com_android_server_AlarmManagerService.cpp \com_android_server_BatteryService.cpp \com_android_server_HardwareService.cpp \com_android_server_KeyInputQueue.cpp \com android server SensorService cpp \com_android_server_SensorService.cpp \com_android_server_SystemServer.cpp \onload.cpp

LOCAL_C_INCLUDES += \$(JNI_H_INCLUDE)

LOCAL SHARED LIBRARIES := \LOCAL_SHARED_LIBRARIES : \libcutils \libhardware \libhardware_legacy \lib i h llibnativehelper \libsystem_server \libutils \libuilibui

LOCAL_MODULE:= libandroid_servers

Page 32: 안드로이드 스터디 Jni 발표 자료 Rev05 송형주

onload cpponload.cppextern "C" jint JNI OnLoad(JavaVM* vm  void* reserved)extern  C  jint JNI_OnLoad(JavaVM* vm, void* reserved){

JNIEnv* env = NULL;jint result = ‐1;

if (vm‐>GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {LOGE("GetEnv failed!");return result;return result;

}LOG_ASSERT(env, "Could not retrieve the env!");

register_android_server_KeyInputQueue(env);register_android_server_HardwareService(env);register_android_server_AlarmManagerService(env);register android server BatteryService(env);register_android_server_BatteryService(env);register_android_server_SensorService(env);register_android_server_SystemServer(env);

return JNI_VERSION_1_4;}

Page 33: 안드로이드 스터디 Jni 발표 자료 Rev05 송형주

What is NDK?What is NDK?

안드로이드 애플리케이션에서 네이티브 코드를 사용하는 모• 안드로이드 애플리케이션에서 네이티브 코드를 사용하는 모듈 등을 추가하기 위해 개발자에게 제공되는 툴

• NDK에서 제공되는 것들– C/C++ 소스 코드로부터 네이티브 라이브러리를 생성하기 위한

각종 툴 및 빌드 파일.

– 네이티브 라이브러리를 안드로이드 배포용 패키지 파일(APK)에삽입하기 위한 방법

– 안드로이드 SDK(1.5버전 이후)을 지원하기 위한 시스템 헤더 및라이브러리

– 문서, 샘플, 튜터리얼

Page 34: 안드로이드 스터디 Jni 발표 자료 Rev05 송형주

NDK 개발 환경 설치NDK 개발 환경 설치

Page 35: 안드로이드 스터디 Jni 발표 자료 Rev05 송형주

NDK Samples : HelloJni public class HelloJni extends Activity{

/** Called when the activity is first created. */@Override@public void onCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState);TextView  tv = new TextView(this);( );tv.setText( stringFromJNI() );setContentView(tv);

}

/* A native method that is implemented by the* 'hello‐jni' native library, which is packaged* with this application.*//

public native String  stringFromJNI();

/* this is used to load the 'hello‐jni' library on application* startup. The library has already been unpacked intop y y p* /data/data/com.example.HelloJni/lib/libhello‐jni.so at* installation time by the package manager.*/

static {{System.loadLibrary("hello‐jni");

}}

Page 36: 안드로이드 스터디 Jni 발표 자료 Rev05 송형주

NDK Samples : HelloJniNDK Samples : HelloJni

NDK 빌드 툴을 통한 네이티브 라이브러리 생성NDK 빌드 툴을 통한 네이티브 라이브러리 생성(libhello-jni.so 생성됨)

Page 37: 안드로이드 스터디 Jni 발표 자료 Rev05 송형주

NDK Samples : HelloJni 프로젝트p

Page 38: 안드로이드 스터디 Jni 발표 자료 Rev05 송형주

NDK Samples : HelloJniNDK Samples : HelloJni

Page 39: 안드로이드 스터디 Jni 발표 자료 Rev05 송형주

3. APP_PROCESS 동작 분석

Page 40: 안드로이드 스터디 Jni 발표 자료 Rev05 송형주

app process 의 동작 구조app_process 의 동작 구조1) Dalvik Virtual Machine 로딩

AndroidRuntime객체 main()

ZygoteInit

) 딩및 런타임 초기화 2) ZygoteInit 클래스 로딩 후, main() 실행

객체

CallStaticVoidMethod

AppRuntime 객체Dalvik

Virtual Macine

Native Fucnctions

C/C++ Side Java Side

Page 41: 안드로이드 스터디 Jni 발표 자료 Rev05 송형주

JNI 적용된 Android SourceJNI 적용된 Android Source

• frameworks\base\core\jni• frameworks\base\services\jniframeworks\base\services\jni• frameworks\base\media\jni

Page 42: 안드로이드 스터디 Jni 발표 자료 Rev05 송형주

참조참조

S J N i I f ’ G id d S ifi i• Sun Java Native Interface Programmer’s Guide and Specification– http://java.sun.com/docs/books/jni/html/jniTOC.html

• Using JNI_OnLoad and JNI_OnUnload for Your Native Library, Part 1– http://combativecoder.wordpress.com/2008/06/02/using-jni_onload-and-

jni_onunload-for-your-native-library-part-1/

Page 43: 안드로이드 스터디 Jni 발표 자료 Rev05 송형주

Dalvik VM 로딩하는 app_process 소스 코드 설명

Page 44: 안드로이드 스터디 Jni 발표 자료 Rev05 송형주

안드로이드에서 네이티브 함수 등록하는 코드 예제

Page 45: 안드로이드 스터디 Jni 발표 자료 Rev05 송형주

ZygoteInit 클래스 로딩 설명ZygoteInit 클래스 로딩 설명