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 동작 원리
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이
만들어져야 한다.
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
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 생성됨)
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
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/
•