SlideShare una empresa de Scribd logo
1 de 45
Descargar para leer sin conexión
app_process & JNI

      송형주
Contents
• 1. Zygote의 전체 동작 Flow
• 2 Android와 JNI
  2.
 – 2.1   JNI란?
 –2 2
   2.2   J
         Java에서 C라이브러리 사용
             에서
 – 2.3   C에서 자바 클래스 사용
 – 2.4   네이티브 함수 등록
 –2 5
   2.5   NDK
• 3. app_process 동작 원리
1. ZYGOTE 전체 동작 FLOW
Zygote의 전체 동작 Flow
        init 프로세스


    service_manager 프로세스


    app_process 프로세스


      DVM 및 Runtime


         ZygoteInit


    System Server 프로세스


      각종 Service 실행
2. ANDROID와 JNI
Java Side




   JNI




C/C++ Side
왜 안드로이드에서 JNI를 알아야 하나?

• 안드로이드 프레임워크의 구조를 제대로 이해하기
  위해서
 – 안드로이드는 J      Java와 C/C++로 이루어진 프레임워크
                      와
 – Java와 C/C++ 모듈을 연결해주는 매개체가 바로 JNI
   (Java Native Interface)이다.
                Interface)이다

• 안드로이드의 새로운 기능을 추가하고자 할때
 – 기존 C/C++ 코드의 재활용
 – 새로운 서비스 추가
        서    추
   • (ex 리눅스 디바이스 드라이버 프로그래밍)
왜 JNI를 사용하는가?
• 1 속도 문제가 있는 계산 루틴
  1.
  자바가 Native Code(플랫폼에 종속적인 기계어 코드)에
  비해 느리다.

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

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


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




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

                HelloJniClass
                H ll J iCl
                    Class
                  native Hello()       native 메서드 선언




              Java Virtual Machine




               Java_HelloJNI_Hello()   native 메서드 구현
                                       (
                                       (JVM이 식별가능하도록 native
                                           이 식별가능하 록
                 Sample.dll
                 S   l dll             method 이름이 정의됨.)



      해당 DLL 파일은 J
                 Java Virtual M hi 이 인식할 수 있도록
                      Vi t l Machine이
      만들어져야 한다.
구현 순서
Step 1: Write the Java Code
Step 2: Compile the Java Code
Step 3: Create the .h File
                       h
javah 명령어 이용
Step3 결과
Step 4: Write the Native Method
        Implementation
Step5.
                    Step5 Create DLL
cl -I"C:Program FilesJavajdk1.6.0_14include" -I"C:Program FilesJavajdk1.6.0_14includewin32"
-LD HelloC.c -FeHelloC.dll




 •   cl : visual c++ 컴파일 명령어
 •   ‐I : include 시킬 헤더 파일 경로
      I : include 시킬
      – jni.h (C:Program FilesJavajdk1.6.0_14include)
      – jni_md.h (C:Program FilesJavajdk1.6.0_14includewin32)
 •   ‐LD : DLL을 만든다.
 •   ‐Fe<파일명> : 생성할 파일 이름을 지정.
Step5 결과
Step 6: Run the Program
응용
•   그렇다면 기존 DLL의 경우는 JNI 인터페이스에 맞게 다시 DLL을 만
    들어줘야 하나??


                HelloJNI Class
                  native OldHello()        native 메서드 선언




               Java Virtual Machine


      JNI 가능한 DLL 파일                                기존 DLL 파일
                Java_HelloJNI_OldHello()               OldHello()

                      HelloC.dll
                      H ll C dll                    OldHelloC.dll
                                                    OldH ll C dll
Calling Java code from C/C++
            Programs
• C/C++ 애플리케이션에서 Java 클래스의 메서드
  를 호출할 수 있나?
 – 어찌됐건 Java 클래스의 메서드를 실행하기 위해서는
   Java Virtual Machine이 필요함.


• Native 애플리케이션 영역내에 JVM을 로딩할 필
                영          딩
  요가 있는가?
 – 자바 애플릿을 처리하는 웹브라우저 애플리케이션의
                웹 라우저
   경우
Calling Java code from C/C++ Programs

                Hello Class

                     Hello()




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




             Java Virtual Machine

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


                C/C ++ Native Code
로딩할 Java 클래스 코드 작성
Java 클래스를 호출할 C 애플리케이션 작성
실행 결과
Register Native Methods
• 자바 프로그래머
 – 1. System.load 함수 이용 : native 라이브러리 로딩
 – 2 VM이 자바의 네이티브 메소드를 로딩한 라이브러
   2.
   리의 native 함수로 연결

• C 프로그래머
 – RegisterNatives (JNI API 이용)
 – 네이티브 함수 코드를 클래스의 native 메서드에 연결
                                ti
   가능
 – VM이 링크하는 것보다 훨씬 능률적이고 빠름.
 – VM을 포함하고 있는 C 프로그램에서 C 자체의 native
   함수를
Register Native Method 개념


native native0(String msg )                             Java_Test_native0

natvie native1( )                                       Java_Test_native1
                               fuction mappting table

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




                                  RegisterNative 함수 이용.
                              (JVM에 native funcation을 링크시킴)
RegisterNatives 함수
• JNIN ti M th d 구조체
  JNINativeMethod
    typedef struct {
            char  name; 
            char *name;              // Name of native method
            char *signature;         // JNI method signature
            void *fnPtr;             // Addr. of native method impl.
    } JNINativeMethod


• RegisterNatives 함수
    jint RegisterNatives(JNIEnv *env, 
                             jclass clazz,
                             const JNINativeMethod *methods,
                             jint nMethods);
                             ji t  M th d )

•   clazz 인수에 의해 지정된 클래스의 네이티브 메소드를 등록합니다.
•   methods 파라미터는, 그 네이티브 메소드의 이름, 시그니처, 함수 포인
    터를 포함한 JNINativeMethod 구조체의 배열을 지정합니다.
•   nMethods 파라미터는, 배열내의 네이티브 메소드의 수를 지정합니다.
Android JNI Help 함수
JNI_Onload
                     JNI Onload
• Wh a Java class with native methods i l d d it h n
  When J          l     ith ti         th d is loaded, has
  o “wiring” to the native classes until System.loadLibrary("N
  ativeLibName") is called. If it is exported by the library, JNI
  _OnLoad is called first. After that, the JVM tries to map libr
   OnLoad            first        that
  ary symbols to native methods.

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

• It may seem unnecessary to export JNI_OnLoad from your
  library if you don’t have anything to initialize.
JNI_Onload (사용예)
             libandroid_servers.so
             libandroid 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 
        libnativehelper 
        lib i h l
        libsystem_server 
        libutils 
        libui

LOCAL_MODULE:= libandroid_servers
onload.cpp
                    onload cpp
extern  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;
    }
    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;
}
What is NDK?
• 안드로이드 애플리케이션에서 네이티브 코드를 사용하는 모
  듈 등을 추가하기 위해 개발자에게 제공되는 툴

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

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

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

  – 문서, 샘플, 튜터리얼
NDK 개발 환경 설치
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 into
              p            y           y        p
      * /data/data/com.example.HelloJni/lib/libhello‐jni.so at
      * installation time by the package manager.
      */
    static {{
         System.loadLibrary("hello‐jni");
    }
}
NDK Samples : HelloJni




NDK 빌드 툴을 통한 네이티브 라이브러리 생성
        (libhello-jni.so 생성됨)
NDK Samples : HelloJni 프로젝트
       p
NDK Samples : HelloJni
3. APP_PROCESS 동작 분석
app_process
app process 의 동작 구조
              1) Dalvik Virtual Machine 로딩
               )                         딩
                 및 런타임 초기화                      2) ZygoteInit 클래스 로딩 후, main() 실행

                                                                    ZygoteInit
AndroidRuntime
     객체                                                              main()
                                 CallStaticVoidMethod




                                        Dalvik
AppRuntime 객체                      Virtual Macine




Native Fucnctions




     C/C++ Side                                                  Java Side
JNI 적용된 Android Source
• frameworksbasecorejni
• frameworksbaseservicesjni
• frameworksbasemediajni
참조
•   Sun J
    S Java Native I
           N i Interface Programmer’s Guide and Specification
                    f              ’ G id     dS    ifi i
     –   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/
•
Dalvik VM 로딩하는 app_process
         소스 코드 설명
안드로이드에서 네이티브 함수 등
    록하는 코드 예제
ZygoteInit 클래스 로딩 설명

Más contenido relacionado

La actualidad más candente

이승재, 사례로 배우는 디스어셈블리 디버깅, NDC2014
이승재, 사례로 배우는 디스어셈블리 디버깅, NDC2014이승재, 사례로 배우는 디스어셈블리 디버깅, NDC2014
이승재, 사례로 배우는 디스어셈블리 디버깅, NDC2014devCAT Studio, NEXON
 
What is Game Server ?
What is Game Server ?What is Game Server ?
What is Game Server ?흥배 최
 
CASL vs CAN-SPAM - Canada’s Anti‐Spam Law
CASL vs CAN-SPAM - Canada’s Anti‐Spam LawCASL vs CAN-SPAM - Canada’s Anti‐Spam Law
CASL vs CAN-SPAM - Canada’s Anti‐Spam LawNow Dentons
 
게임 개발에 자주 사용되는 디자인 패턴
게임 개발에 자주 사용되는 디자인 패턴게임 개발에 자주 사용되는 디자인 패턴
게임 개발에 자주 사용되는 디자인 패턴예림 임
 
[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화
[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화
[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화Jaeseung Ha
 
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010Ryan Park
 
[NDC 2009] 행동 트리로 구현하는 인공지능
[NDC 2009] 행동 트리로 구현하는 인공지능[NDC 2009] 행동 트리로 구현하는 인공지능
[NDC 2009] 행동 트리로 구현하는 인공지능Yongha Kim
 
[2019] 언리얼 엔진을 통해 살펴보는 리플렉션과 가비지 컬렉션
[2019] 언리얼 엔진을 통해 살펴보는 리플렉션과 가비지 컬렉션[2019] 언리얼 엔진을 통해 살펴보는 리플렉션과 가비지 컬렉션
[2019] 언리얼 엔진을 통해 살펴보는 리플렉션과 가비지 컬렉션NHN FORWARD
 
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019min woog kim
 
Introduction to DirectX 12 Programming , Ver 1.5
Introduction to DirectX 12 Programming , Ver 1.5Introduction to DirectX 12 Programming , Ver 1.5
Introduction to DirectX 12 Programming , Ver 1.5YEONG-CHEON YOU
 
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018devCAT Studio, NEXON
 
Building UI for games using the new UI Builder - Unite Copenhagen 2019
Building UI for games using the new UI Builder - Unite Copenhagen 2019Building UI for games using the new UI Builder - Unite Copenhagen 2019
Building UI for games using the new UI Builder - Unite Copenhagen 2019Unity Technologies
 
Visual Studio를 이용한 어셈블리어 학습 part 1
Visual Studio를 이용한 어셈블리어 학습 part 1Visual Studio를 이용한 어셈블리어 학습 part 1
Visual Studio를 이용한 어셈블리어 학습 part 1YEONG-CHEON YOU
 
06_게임엔진구성
06_게임엔진구성06_게임엔진구성
06_게임엔진구성noerror
 
IndirectDraw with unity
IndirectDraw with unityIndirectDraw with unity
IndirectDraw with unityJung Suk Ko
 
NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현noerror
 
Doom Technical Review
Doom Technical ReviewDoom Technical Review
Doom Technical ReviewAli Salehi
 
게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013
게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013
게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013영욱 오
 
2022 John Henry: Score 5
2022 John Henry: Score 52022 John Henry: Score 5
2022 John Henry: Score 5Brenda Robson
 

La actualidad más candente (20)

이승재, 사례로 배우는 디스어셈블리 디버깅, NDC2014
이승재, 사례로 배우는 디스어셈블리 디버깅, NDC2014이승재, 사례로 배우는 디스어셈블리 디버깅, NDC2014
이승재, 사례로 배우는 디스어셈블리 디버깅, NDC2014
 
What is Game Server ?
What is Game Server ?What is Game Server ?
What is Game Server ?
 
Motion blur
Motion blurMotion blur
Motion blur
 
CASL vs CAN-SPAM - Canada’s Anti‐Spam Law
CASL vs CAN-SPAM - Canada’s Anti‐Spam LawCASL vs CAN-SPAM - Canada’s Anti‐Spam Law
CASL vs CAN-SPAM - Canada’s Anti‐Spam Law
 
게임 개발에 자주 사용되는 디자인 패턴
게임 개발에 자주 사용되는 디자인 패턴게임 개발에 자주 사용되는 디자인 패턴
게임 개발에 자주 사용되는 디자인 패턴
 
[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화
[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화
[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화
 
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
 
[NDC 2009] 행동 트리로 구현하는 인공지능
[NDC 2009] 행동 트리로 구현하는 인공지능[NDC 2009] 행동 트리로 구현하는 인공지능
[NDC 2009] 행동 트리로 구현하는 인공지능
 
[2019] 언리얼 엔진을 통해 살펴보는 리플렉션과 가비지 컬렉션
[2019] 언리얼 엔진을 통해 살펴보는 리플렉션과 가비지 컬렉션[2019] 언리얼 엔진을 통해 살펴보는 리플렉션과 가비지 컬렉션
[2019] 언리얼 엔진을 통해 살펴보는 리플렉션과 가비지 컬렉션
 
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
 
Introduction to DirectX 12 Programming , Ver 1.5
Introduction to DirectX 12 Programming , Ver 1.5Introduction to DirectX 12 Programming , Ver 1.5
Introduction to DirectX 12 Programming , Ver 1.5
 
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
 
Building UI for games using the new UI Builder - Unite Copenhagen 2019
Building UI for games using the new UI Builder - Unite Copenhagen 2019Building UI for games using the new UI Builder - Unite Copenhagen 2019
Building UI for games using the new UI Builder - Unite Copenhagen 2019
 
Visual Studio를 이용한 어셈블리어 학습 part 1
Visual Studio를 이용한 어셈블리어 학습 part 1Visual Studio를 이용한 어셈블리어 학습 part 1
Visual Studio를 이용한 어셈블리어 학습 part 1
 
06_게임엔진구성
06_게임엔진구성06_게임엔진구성
06_게임엔진구성
 
IndirectDraw with unity
IndirectDraw with unityIndirectDraw with unity
IndirectDraw with unity
 
NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현
 
Doom Technical Review
Doom Technical ReviewDoom Technical Review
Doom Technical Review
 
게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013
게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013
게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013
 
2022 John Henry: Score 5
2022 John Henry: Score 52022 John Henry: Score 5
2022 John Henry: Score 5
 

Destacado

Android Wear Hackathon 요리 레시피 앱 발표자료
Android Wear Hackathon 요리 레시피 앱 발표자료Android Wear Hackathon 요리 레시피 앱 발표자료
Android Wear Hackathon 요리 레시피 앱 발표자료HwanIk Kim
 
Kernel 2.6 makefile_분석(송형주)
Kernel 2.6 makefile_분석(송형주)Kernel 2.6 makefile_분석(송형주)
Kernel 2.6 makefile_분석(송형주)iamhjoo (송형주)
 
About Init In Android By Andstudy
About Init In Android By AndstudyAbout Init In Android By Andstudy
About Init In Android By Andstudyiamhjoo (송형주)
 
안드로이드 멀티스레딩 입문 송형주
안드로이드 멀티스레딩 입문 송형주안드로이드 멀티스레딩 입문 송형주
안드로이드 멀티스레딩 입문 송형주iamhjoo (송형주)
 
Workshop su Android Kernel Hacking
Workshop su Android Kernel HackingWorkshop su Android Kernel Hacking
Workshop su Android Kernel HackingDeveler S.r.l.
 
Timings of Init : Android Ramdisks for the Practical Hacker
Timings of Init : Android Ramdisks for the Practical HackerTimings of Init : Android Ramdisks for the Practical Hacker
Timings of Init : Android Ramdisks for the Practical HackerStacy Devino
 
An Introduction to the Android Framework -- a core architecture view from app...
An Introduction to the Android Framework -- a core architecture view from app...An Introduction to the Android Framework -- a core architecture view from app...
An Introduction to the Android Framework -- a core architecture view from app...William Liang
 
Android For Managers Slides
Android For Managers SlidesAndroid For Managers Slides
Android For Managers SlidesMarko Gargenta
 
Tuotan-Olen olemassa. Sisältöä sosiaaliseen mediaan
Tuotan-Olen olemassa. Sisältöä sosiaaliseen mediaanTuotan-Olen olemassa. Sisältöä sosiaaliseen mediaan
Tuotan-Olen olemassa. Sisältöä sosiaaliseen mediaanPasi Siltakorpi
 

Destacado (20)

Android Wear Hackathon 요리 레시피 앱 발표자료
Android Wear Hackathon 요리 레시피 앱 발표자료Android Wear Hackathon 요리 레시피 앱 발표자료
Android Wear Hackathon 요리 레시피 앱 발표자료
 
Bootchart 송형주
Bootchart 송형주Bootchart 송형주
Bootchart 송형주
 
Kernel 2.6 makefile_분석(송형주)
Kernel 2.6 makefile_분석(송형주)Kernel 2.6 makefile_분석(송형주)
Kernel 2.6 makefile_분석(송형주)
 
About Init In Android By Andstudy
About Init In Android By AndstudyAbout Init In Android By Andstudy
About Init In Android By Andstudy
 
안드로이드 멀티스레딩 입문 송형주
안드로이드 멀티스레딩 입문 송형주안드로이드 멀티스레딩 입문 송형주
안드로이드 멀티스레딩 입문 송형주
 
Workshop su Android Kernel Hacking
Workshop su Android Kernel HackingWorkshop su Android Kernel Hacking
Workshop su Android Kernel Hacking
 
Timings of Init : Android Ramdisks for the Practical Hacker
Timings of Init : Android Ramdisks for the Practical HackerTimings of Init : Android Ramdisks for the Practical Hacker
Timings of Init : Android Ramdisks for the Practical Hacker
 
An Introduction to the Android Framework -- a core architecture view from app...
An Introduction to the Android Framework -- a core architecture view from app...An Introduction to the Android Framework -- a core architecture view from app...
An Introduction to the Android Framework -- a core architecture view from app...
 
Android Custom Kernel/ROM design
Android Custom Kernel/ROM designAndroid Custom Kernel/ROM design
Android Custom Kernel/ROM design
 
Night life
Night lifeNight life
Night life
 
Poison Center Services 2008
Poison Center Services 2008Poison Center Services 2008
Poison Center Services 2008
 
Adobe Indesign CS 5.5 (Corso Base)
Adobe Indesign CS 5.5 (Corso Base)Adobe Indesign CS 5.5 (Corso Base)
Adobe Indesign CS 5.5 (Corso Base)
 
... And the Clients Went Wild
... And the Clients Went Wild... And the Clients Went Wild
... And the Clients Went Wild
 
Picking the right business model
Picking the right business modelPicking the right business model
Picking the right business model
 
Front end anno 2014
Front end anno 2014Front end anno 2014
Front end anno 2014
 
Android For Managers Slides
Android For Managers SlidesAndroid For Managers Slides
Android For Managers Slides
 
Guida a Linkedin: profilo personale e aziendale
Guida a Linkedin: profilo personale e aziendaleGuida a Linkedin: profilo personale e aziendale
Guida a Linkedin: profilo personale e aziendale
 
PHP on Windows
PHP on WindowsPHP on Windows
PHP on Windows
 
Tuotan-Olen olemassa. Sisältöä sosiaaliseen mediaan
Tuotan-Olen olemassa. Sisältöä sosiaaliseen mediaanTuotan-Olen olemassa. Sisältöä sosiaaliseen mediaan
Tuotan-Olen olemassa. Sisältöä sosiaaliseen mediaan
 
Guida alla Colorazione digitale
Guida alla Colorazione digitaleGuida alla Colorazione digitale
Guida alla Colorazione digitale
 

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

Android ndk jni 설치및 연동
Android ndk jni 설치및 연동Android ndk jni 설치및 연동
Android ndk jni 설치및 연동Sangon Lee
 
안드로이드 와 디바이스 드라이버 적용 기법
안드로이드 와 디바이스 드라이버 적용 기법안드로이드 와 디바이스 드라이버 적용 기법
안드로이드 와 디바이스 드라이버 적용 기법chon2010
 
Java Virtual Machine, Call stack, Java Byte Code
Java Virtual Machine, Call stack, Java Byte CodeJava Virtual Machine, Call stack, Java Byte Code
Java Virtual Machine, Call stack, Java Byte CodeJavajigi Jaesung
 
Java 강의자료 ed11
Java 강의자료 ed11Java 강의자료 ed11
Java 강의자료 ed11hungrok
 
Jdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamicJdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamicknight1128
 
React native development
React native developmentReact native development
React native developmentSangSun Park
 
V8 add on with middleware modules
V8 add on with middleware modulesV8 add on with middleware modules
V8 add on with middleware modulesJay Kim
 
[shaderx6]8.2 3d engine tools with c++cli
[shaderx6]8.2 3d engine tools with c++cli[shaderx6]8.2 3d engine tools with c++cli
[shaderx6]8.2 3d engine tools with c++cli종빈 오
 
안드로이드 플랫폼 설명
안드로이드 플랫폼 설명안드로이드 플랫폼 설명
안드로이드 플랫폼 설명Peter YoungSik Yun
 
Project anarchy로 3 d 게임 만들기 part_1
Project anarchy로 3 d 게임 만들기 part_1Project anarchy로 3 d 게임 만들기 part_1
Project anarchy로 3 d 게임 만들기 part_1Dong Chan Shin
 
[170403 2주차]C언어 A반
[170403 2주차]C언어 A반[170403 2주차]C언어 A반
[170403 2주차]C언어 A반arundine
 
Android Native Module 안정적으로 개발하기
Android Native Module 안정적으로 개발하기Android Native Module 안정적으로 개발하기
Android Native Module 안정적으로 개발하기hanbeom Park
 
웹 프론트엔드 테스팅
웹 프론트엔드 테스팅웹 프론트엔드 테스팅
웹 프론트엔드 테스팅Eunsu Kim
 

Similar a 안드로이드 스터디 Jni 발표 자료 Rev05 송형주 (20)

java_1장.pptx
java_1장.pptxjava_1장.pptx
java_1장.pptx
 
java_1장
java_1장java_1장
java_1장
 
Android ndk jni 설치및 연동
Android ndk jni 설치및 연동Android ndk jni 설치및 연동
Android ndk jni 설치및 연동
 
java_1장.pptx
java_1장.pptxjava_1장.pptx
java_1장.pptx
 
안드로이드 와 디바이스 드라이버 적용 기법
안드로이드 와 디바이스 드라이버 적용 기법안드로이드 와 디바이스 드라이버 적용 기법
안드로이드 와 디바이스 드라이버 적용 기법
 
Java_01 기초
Java_01 기초Java_01 기초
Java_01 기초
 
Java 기초
Java 기초Java 기초
Java 기초
 
Java Virtual Machine, Call stack, Java Byte Code
Java Virtual Machine, Call stack, Java Byte CodeJava Virtual Machine, Call stack, Java Byte Code
Java Virtual Machine, Call stack, Java Byte Code
 
Java 강의자료 ed11
Java 강의자료 ed11Java 강의자료 ed11
Java 강의자료 ed11
 
Jdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamicJdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamic
 
React native development
React native developmentReact native development
React native development
 
V8 add on with middleware modules
V8 add on with middleware modulesV8 add on with middleware modules
V8 add on with middleware modules
 
[shaderx6]8.2 3d engine tools with c++cli
[shaderx6]8.2 3d engine tools with c++cli[shaderx6]8.2 3d engine tools with c++cli
[shaderx6]8.2 3d engine tools with c++cli
 
안드로이드 플랫폼 설명
안드로이드 플랫폼 설명안드로이드 플랫폼 설명
안드로이드 플랫폼 설명
 
Project anarchy로 3 d 게임 만들기 part_1
Project anarchy로 3 d 게임 만들기 part_1Project anarchy로 3 d 게임 만들기 part_1
Project anarchy로 3 d 게임 만들기 part_1
 
Node.js 기본
Node.js 기본Node.js 기본
Node.js 기본
 
Node.js intro
Node.js introNode.js intro
Node.js intro
 
[170403 2주차]C언어 A반
[170403 2주차]C언어 A반[170403 2주차]C언어 A반
[170403 2주차]C언어 A반
 
Android Native Module 안정적으로 개발하기
Android Native Module 안정적으로 개발하기Android Native Module 안정적으로 개발하기
Android Native Module 안정적으로 개발하기
 
웹 프론트엔드 테스팅
웹 프론트엔드 테스팅웹 프론트엔드 테스팅
웹 프론트엔드 테스팅
 

Último

Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Kim Daeun
 
Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Wonjun Hwang
 
A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)Tae Young Lee
 
Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Wonjun Hwang
 
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionMOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionKim Daeun
 
캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스
 

Último (6)

Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
 
Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)
 
A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)
 
Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)
 
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionMOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
 
캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차
 

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

  • 1. app_process & JNI 송형주
  • 2. Contents • 1. Zygote의 전체 동작 Flow • 2 Android와 JNI 2. – 2.1 JNI란? –2 2 2.2 J Java에서 C라이브러리 사용 에서 – 2.3 C에서 자바 클래스 사용 – 2.4 네이티브 함수 등록 –2 5 2.5 NDK • 3. app_process 동작 원리
  • 3. 1. ZYGOTE 전체 동작 FLOW
  • 4. Zygote의 전체 동작 Flow init 프로세스 service_manager 프로세스 app_process 프로세스 DVM 및 Runtime ZygoteInit System Server 프로세스 각종 Service 실행
  • 6. Java Side JNI C/C++ Side
  • 7. 왜 안드로이드에서 JNI를 알아야 하나? • 안드로이드 프레임워크의 구조를 제대로 이해하기 위해서 – 안드로이드는 J Java와 C/C++로 이루어진 프레임워크 와 – Java와 C/C++ 모듈을 연결해주는 매개체가 바로 JNI (Java Native Interface)이다. Interface)이다 • 안드로이드의 새로운 기능을 추가하고자 할때 – 기존 C/C++ 코드의 재활용 – 새로운 서비스 추가 서 추 • (ex 리눅스 디바이스 드라이버 프로그래밍)
  • 8. 왜 JNI를 사용하는가? • 1 속도 문제가 있는 계산 루틴 1. 자바가 Native Code(플랫폼에 종속적인 기계어 코드)에 비해 느리다. • 2. 자바에서 하드웨어 제어를 하지 못함. • 3. 자바에서 지원되지 않은 특정 운영체제 서비스 자바의 클래스 라이브러리는 방대하고 다양한 서비스를 제공하지만, 특정 플랫폼에서 제공하는 고유의 서비스의 기능을 모두 포함할 수는 없다 특히 없다. 특히, 특수한 목적으로 제작된 하드웨어를 자바에서 제어해야 할 필요가 있다고 한다면, 자바만으로 해결하기는 힘들다. • 4. 기존의 프로그램(C/C++)에서 자바가 제공하는 서비스 를 이용 기존에 작성된 프로그램이나 기존의 시스템(legacy)과의 연계 문제
  • 9. What is JNI(Java Native Interface)? 자바와 자바 이외의 언어로 만들어진 애플리케이션이나 라이브러리가 상호 작용할 수 있도록 연결시켜 주는 인터페이스
  • 10. Calling C/C++ code from Java programs C/C HelloJniClass H ll J iCl Class native Hello() native 메서드 선언 Java Virtual Machine Java_HelloJNI_Hello() native 메서드 구현 ( (JVM이 식별가능하도록 native 이 식별가능하 록 Sample.dll S l dll method 이름이 정의됨.) 해당 DLL 파일은 J Java Virtual M hi 이 인식할 수 있도록 Vi t l Machine이 만들어져야 한다.
  • 12. Step 1: Write the Java Code
  • 13. Step 2: Compile the Java Code
  • 14. Step 3: Create the .h File h javah 명령어 이용
  • 16. Step 4: Write the Native Method Implementation
  • 17. Step5. Step5 Create DLL cl -I"C:Program FilesJavajdk1.6.0_14include" -I"C:Program FilesJavajdk1.6.0_14includewin32" -LD HelloC.c -FeHelloC.dll • cl : visual c++ 컴파일 명령어 • ‐I : include 시킬 헤더 파일 경로 I : include 시킬 – jni.h (C:Program FilesJavajdk1.6.0_14include) – jni_md.h (C:Program FilesJavajdk1.6.0_14includewin32) • ‐LD : DLL을 만든다. • ‐Fe<파일명> : 생성할 파일 이름을 지정.
  • 19. Step 6: Run the Program
  • 20. 응용 • 그렇다면 기존 DLL의 경우는 JNI 인터페이스에 맞게 다시 DLL을 만 들어줘야 하나?? HelloJNI Class native OldHello() native 메서드 선언 Java Virtual Machine JNI 가능한 DLL 파일 기존 DLL 파일 Java_HelloJNI_OldHello() OldHello() HelloC.dll H ll C dll OldHelloC.dll OldH ll C dll
  • 21. Calling Java code from C/C++ Programs • C/C++ 애플리케이션에서 Java 클래스의 메서드 를 호출할 수 있나? – 어찌됐건 Java 클래스의 메서드를 실행하기 위해서는 Java Virtual Machine이 필요함. • Native 애플리케이션 영역내에 JVM을 로딩할 필 영 딩 요가 있는가? – 자바 애플릿을 처리하는 웹브라우저 애플리케이션의 웹 라우저 경우
  • 22. Calling Java code from C/C++ Programs Hello Class Hello() 3. 메서드 실행 2. 클래스 로딩 Java Virtual Machine 1. 1 JVM 로딩 (JNI invokation API 이용) C/C ++ Native Code
  • 23. 로딩할 Java 클래스 코드 작성
  • 24. Java 클래스를 호출할 C 애플리케이션 작성
  • 26. Register Native Methods • 자바 프로그래머 – 1. System.load 함수 이용 : native 라이브러리 로딩 – 2 VM이 자바의 네이티브 메소드를 로딩한 라이브러 2. 리의 native 함수로 연결 • C 프로그래머 – RegisterNatives (JNI API 이용) – 네이티브 함수 코드를 클래스의 native 메서드에 연결 ti 가능 – VM이 링크하는 것보다 훨씬 능률적이고 빠름. – VM을 포함하고 있는 C 프로그램에서 C 자체의 native 함수를
  • 27. Register Native Method 개념 native native0(String msg ) Java_Test_native0 natvie native1( ) Java_Test_native1 fuction mappting table java virtual machine C Application Test 클래스 (DLL 형태 아님) RegisterNative 함수 이용. (JVM에 native funcation을 링크시킴)
  • 28. RegisterNatives 함수 • JNIN ti M th d 구조체 JNINativeMethod typedef struct { char  name;  char *name;  // Name of native method char *signature; // JNI method signature void *fnPtr; // Addr. of native method impl. } JNINativeMethod • RegisterNatives 함수 jint RegisterNatives(JNIEnv *env,  jclass clazz, const JNINativeMethod *methods, jint nMethods); ji t  M th d ) • clazz 인수에 의해 지정된 클래스의 네이티브 메소드를 등록합니다. • methods 파라미터는, 그 네이티브 메소드의 이름, 시그니처, 함수 포인 터를 포함한 JNINativeMethod 구조체의 배열을 지정합니다. • nMethods 파라미터는, 배열내의 네이티브 메소드의 수를 지정합니다.
  • 30. JNI_Onload JNI Onload • Wh a Java class with native methods i l d d it h n When J l ith ti th d is loaded, has o “wiring” to the native classes until System.loadLibrary("N ativeLibName") is called. If it is exported by the library, JNI _OnLoad is called first. After that, the JVM tries to map libr OnLoad first that ary symbols to native methods. • JNI O L d i th JNI_OnLoad is there f t for two reasons: t specify th minim to if the i i um JNI version needed by the library and to perform librar y initialization. If it’s not present in your library, the JVM wil l assume that it’s only compliant with the minimum JNI ver it s sion, 1.1. • It may seem unnecessary to export JNI_OnLoad from your library if you don’t have anything to initialize.
  • 31. JNI_Onload (사용예) libandroid_servers.so libandroid 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 libnativehelper lib i h l libsystem_server libutils libui LOCAL_MODULE:= libandroid_servers
  • 32. onload.cpp onload cpp extern  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; } 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; }
  • 33. What is NDK? • 안드로이드 애플리케이션에서 네이티브 코드를 사용하는 모 듈 등을 추가하기 위해 개발자에게 제공되는 툴 • NDK에서 제공되는 것들 – C/C++ 소스 코드로부터 네이티브 라이브러리를 생성하기 위한 각종 툴 및 빌드 파일. – 네이티브 라이브러리를 안드로이드 배포용 패키지 파일(APK)에 삽입하기 위한 방법 – 안드로이드 SDK(1.5버전 이후)을 지원하기 위한 시스템 헤더 및 라이브러리 – 문서, 샘플, 튜터리얼
  • 35. 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 into p y y p * /data/data/com.example.HelloJni/lib/libhello‐jni.so at * installation time by the package manager. */ static {{ System.loadLibrary("hello‐jni"); } }
  • 36. NDK Samples : HelloJni NDK 빌드 툴을 통한 네이티브 라이브러리 생성 (libhello-jni.so 생성됨)
  • 37. NDK Samples : HelloJni 프로젝트 p
  • 38. NDK Samples : HelloJni
  • 40. app_process app process 의 동작 구조 1) Dalvik Virtual Machine 로딩 ) 딩 및 런타임 초기화 2) ZygoteInit 클래스 로딩 후, main() 실행 ZygoteInit AndroidRuntime 객체 main() CallStaticVoidMethod Dalvik AppRuntime 객체 Virtual Macine Native Fucnctions C/C++ Side Java Side
  • 41. JNI 적용된 Android Source • frameworksbasecorejni • frameworksbaseservicesjni • frameworksbasemediajni
  • 42. 참조 • Sun J S Java Native I N i Interface Programmer’s Guide and Specification f ’ G id dS ifi i – 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/ •
  • 43. Dalvik VM 로딩하는 app_process 소스 코드 설명
  • 44. 안드로이드에서 네이티브 함수 등 록하는 코드 예제