• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
안드로이드 스터디 Jni 발표 자료 Rev05 송형주
 

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

on

  • 22,023 views

 

Statistics

Views

Total Views
22,023
Views on SlideShare
21,662
Embed Views
361

Actions

Likes
8
Downloads
707
Comments
2

16 Embeds 361

http://www.slideshare.net 165
http://winghm.wooriweb.net 81
http://satyr.tistory.com 33
http://ikalus16.blogspot.com 29
http://www.hme.or.kr 23
http://ikalus16.blogspot.kr 8
http://mobilecss.sec.samsung.net 6
http://winghm.wooriweb.co.kr 4
http://slp-info.sec.samsung.net 3
http://www.snailee.pe.kr 2
http://webcache.googleusercontent.com 2
http://cafe.naver.com 1
http://kms.sec.samsung.net 1
http://blog.naver.com 1
http://jaehwacho.springnote.com 1
http://andstudy.springnote.com 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

CC Attribution-NonCommercial-NoDerivs LicenseCC Attribution-NonCommercial-NoDerivs LicenseCC Attribution-NonCommercial-NoDerivs License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel

12 of 2 previous next

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

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

    • 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 클래스 로딩 설명