Interacting with Java from the Native Side

 JNI ���� ǥ�� �������̽� �Լ����� �ִ�. �̰��� �̿��ؼ� Java ��ü�� ���� �� �����ϰ�, ��ü�� �޼ҵ忡 ������ �� �ְ� �ȴ�. ���⿡���� �̷��� �Լ����� ����ϴ� ����� ���ؼ� �����Ѵ�.

Accessing Java Strings

 JNI�� ���ڿ��� ��ȯ�� �� �ִ� �Լ��� �����Ѵ�. �̸� �̿��ؼ� Unicode�� UTF-8 �������� ǥ���� ���ڿ��� ��ȯ�� �� �ֵ��� �Ѵ�.

Accessing Java Arrays

 ���⿡���� �迭�� �����ϰ�, �迭�� ���ҿ� ������ �� �ִ� ����� �����Ѵ�.

Calling Java Methods

 JNI������ ��callback���� �̿��ؼ� native �ڵ�κ��� Java �޼ҵ带 ȣ���� �� �ְ� �ȴ�. javap�� �̿��ϰ� �Ǹ�, Ŭ���� ���Ϸκ��� JNI ��Ÿ���� �޼ҵ� ǥ���� ������ �� �ִ�.

Accessing Java Member Variables

 ���� ���������� ��� ������ ���� ������ �� �� �ִ� ����� JNI ���� �����Ѵ�. javap�� �̿��ϰ� �Ǹ� ���������� JNI ��Ÿ���� ��� ���� ǥ���� ���� �� �ִ�.

Catching and Throwing Exceptions

 ���⿡���� ���� ���׿� ���� �ٷ�� ����� �Ұ��ȴ�. native ���α׷������� catch, throw, clear ���� ���� ó���� �� �� �ִ�.

Local and Global References

 native �ڵ尡 Java ��ü�� ������ �� �ִ� ����� local�� global �� �����̴�. local�� ��쿡�� native �Լ� �������� ������ �����ϰ� �ǰ�, �����ϰ� �Ǹ� �����ȴ�. global�� ��쿡�� ���α׷� ��ü���� ������ �� �ְ� �ȴ�.

Threads and Native Methods

 ���⿡���� ��Ƽ������ ������ native �޼ҵ带 �����ϴ� �Ϳ� ���� �����ȴ�. JNI������ �⺻���� ����ȭ ����� �����ȴ�.

JNI Programming in C++

 C++������ �� �� ������ �������̽��� ����� �� �ְ�, �߰����� Ÿ�� üũ�� �� �� �ִ�.

Accessing Java Strings in Native Methods

 C�� (char *) Ÿ���� jstring Ÿ�԰� ȣȯ�� ���� ����. �׷��Ƿ�, Java ���ڿ��� native ���ڿ��� ��ȯ���� �� �ִ� �Լ��� �ʿ��ϴ�. Java�� UTF-8 Ÿ���� ���ڿ��� Unicode�ʹ� �޸� ASCII ���ڿ��� ȣȯ�� �����ϴ�.

Accessing Java Strings

 Unicode�� UTF-8 Ÿ���� ���ڿ��� ��ȯ���ִ� ���� GetStringUTFChars�� ��������ν� ����������. ���� �������� ���� Ȯ���غ� �� �ִ�.

 return ���� ���� �Ǹ� native ���α׷������� Java���� ����� �� �ִ� ���ڿ��� ������ �������� �� �� �ִ�. ��, NewStringUTF() �Լ��� ����ϸ� �ȴ�.

Using the JNIEnv Interface Pointer

 native �޼ҵ�� env �������̽� �����͸� �̿��ؼ� Java ��ü�� �����ϰų� �ٷ��� �Ѵ�. ���� �׸��� �� ������ ������ ��Ÿ���� ���̴�.

Other JNI Functions for Accessing Java Strings

 ������ �� ���� ������ ���ڿ� ���� �Լ��̴�.

Working With Java Arrays in Native Methods

 jarray�� jstring�� ���������� native �޼ҵ忡�� �����ϱ� ���ؼ��� ��ȯ������ �ʿ��ϴ�.

 ������ Java ���α׷��� ������ �迭�� native �޼ҵ�� �Ѱ��ִ� ��� �Լ��� ������ �ִ�.

Accessing Arrays of Primitive Elements

 ���� C ���α׷������� ���� �������� �Ѱܹ��� �迭�� ó���ؼ� �ٽ� �����ϴ� ������ �����ش�.

 �����ؼ� �� �κ��� GetIntArrayLength(), GetIntArrayElements(), ReleaseIntArrayElements() �Լ��̴�. Get<type>ArrayElements() �Լ��� Java�κ��� ���� �迭�� C���� ����� �� �ֵ��� ��ȯ���ִ� �Լ��̰�, Release<type>ArrayElements() �Լ��� �װ��� �������ִ� �Լ��̴�. �׻� ¦�� �̷M ����� �� �ֵ��� �����ؾ� �Ѵ�. Get<type>ArrayLength() �Լ��� �̿��ؼ� �迭�� ���̵� ���غ� �� �ִ�.
 ���� �� ���� ǥ�� �迭�� ��ȯ���ְų� �������ִ� �Լ��� ������ ���̴�.

 

Function

Array Type

GetBooleanArrayElements

boolean

GetByteArrayElements

byte

GetCharArrayElements

char

GetShortArrayElements

short

GetIntArrayElements

int

GetLongArrayElements

long

GetFloatArrayElements

float

GetDoubleArrayElements

double

JNI Functions for Accessing Arrays

 

Function

Array Type

ReleaseBooleanArrayElements

boolean

ReleaseByteArrayElements

byte

ReleaseCharArrayElements

char

ReleaseShortArrayElements

short

ReleaseIntArrayElements

int

ReleaseLongArrayElements

long

ReleaseFloatArrayElements

float

ReleaseDoubleArrayElements

double

JNI Functions for Releasing Arrays

 Accessing a Small Number of Elements

 Get<type>ArrayElements() �Լ��� �迭 ��ü�� �����ؿ��� ������ �Ѵ�. �뵵�� ���� �迭 ��ü�� ����� �ʿ䰡 ���� �Ϻκи��� ������ �ʿ䵵 ���� �� �ִ�. �� ��쿡�� Get/Set<type>ArrayRegion() �Լ��� ����� �� �ִ�.

 Accessing Arrays of Objects

 ��ü�� �迭�� ������ �� �ִ�. �׷�����, �ѹ��� ��� ��ü�� �迭�� ������ ���� ����.

 Calling Java Methods

 ���� �������� Java Method�� ȣ���ϴ� ����� �����Ѵ�. Java ���α׷����� ȣ���� native �޼ҵ忡�� �ٽ� Java �޼ҵ带 ȣ���ϴ� ������ �����Ѵ�. 5�� �ݺ��ؼ� ȣ���� �ڿ� �����ϰ� �ȴ�.(�׷��� ������ ������ �ݺ��ؼ� ȣ���ϰ� �ȴ�.)

Calling a Java Method from Native Code

 native �ڵ�� ������ ����. native �޼ҵ忡���� �ٽ� Java �޼ҵ带 �ٽ� ȣ���ϰ� �ȴ�.

  1. GetObjectClass() �Լ��� �̿��ؼ� Java ��ü�� Ÿ���� ���� �޴´�.
  2. GetMethodID() �Լ��� �̿��ؼ�, �־��� ��ü���� Java �޼ҵ带 ã�� �� �ֵ��� �Ѵ�. �޼ҵ尡 �������� ���� ��쿡�� 0�� �����Ѵ�. Java ���α׷������� NoSuchMethodError ������ �߻��ȴ�.
  3. Call<return-type>Method�� �̿��ؼ� Java �޼ҵ带 ȣ���Ѵ�.

Forming the Method Name and Method Signature

 �޼ҵ��� �̸��� UTF-8 �������� ǥ���� Java �޼ҵ��� �̸��̴�. �������� ���� Ư����, <init>�� ǥ���ȴ�.
 �޼ҵ��� Ÿ���� ��(argument-type)return-type�� ���·� ǥ���� �Ǹ�, �� Ÿ���� ��Ÿ���� ���� ���� ǥ�� ����.

 

signature

Java Programming Language Type

Z

Boolean

B

byte

C

char

S

short

I

int

J

long

F

float

D

double

L fully-qualified-class;

fully-qulified-class

[ type

type[]

(arg-types)ret-type

method type

Java VM Type Signatures

 ���� ���, ([Ljava/lang/String;)V ��� ǥ���� �Ǿ��ٰ� �ϸ�, ���� Ÿ���� void�̰�, ���ڷ� String ��ü�� �迭�� �Ѱ����ٴ� �ǹ̰� �ȴ�.

Using javap to Generate Method Signatures

 javap�� �̿��ϸ�, ������ Ÿ���� Ȯ���غ� �� �־, Ÿ�� ������ ���� �Ǽ��� ������ �� �ִ�.

Calling Java Methods Using Method Ids

 �޼ҵ� ID�� �� ����ϰ� �Ǹ�, �ݺ��Ǿ ȣ���ؾ� �ϴ� �Լ��� ���ؼ� ȿ�������� ����� �� �ִ�. �޼ҵ� ID�� Ŭ������ unload�Ǹ�, ����� �� ���� �ȴٴ� ���� �����ؾ� �Ѵ�. unload�� ���Ŀ��� ����� �� �ֵ��� �ϱ� ���ؼ��� �ڿ� ������ Local and Global References���� ������ ���� �� �ִ�.

Passing Arguments to Java Methods

 Java �޼ҵ�� ���ڸ� �Ѱ��ִ� ������� ���������� �ִ�. ��κ� �޼ҵ� ID �ڿ� ���ڸ� �ٿ��� �ѱ�� ����̴�. �տ��� �Ұ��� ����� CallVoidMethod() �Լ��� �̿��� ���̾���. �� �ۿ��� �� ������ �Ǵٸ� ����� �����ϴµ� �̰��� �ٷ� CallVoidMethodV()�� CallVoidMethodA()�� �װ��̴�. ������ ��쿡�� va_list��� ���ڸ� �Ѱ��ְ� �ȴ�. �̰��� ���� ���� ���ڸ� �Ѱ��� �� �ֵ��� ���ǵ� Ư���� Ÿ���̴�. ������ ��쿡�� jvalue��� �Ҹ��� union Ÿ���� �迭�� �Ѱ��ִ� ����̴�. jvalue�� ������ ���� ���ǵǾ� �ִ�.

 �߰�������, �Լ��� ���ϰ��� ���� �Լ��� �����ȴ�. CallBooleanMethod(), CallIntMethod() ���� �̷��� ���� ���� �ȴ�.

Calling Class Methods

 class �޼ҵ嵵 �Ϲ� Java �޼ҵ带 ȣ���ϴ� ����� �����ϰ� ȣ���Ѵ�. ������ ���� �ܰ踦 ��ġ�� �ȴ�. GetStaticMethodID() �Լ��� �̿��ؼ� �޼ҵ� ID�� ����. CallStaticVoidMethod(), CallStaticBooleanMethod() ���� �Լ��� �̿��ؼ� ���ϴ� class �޼ҵ带 ȣ���Ѵ�.

Calling Instance Methods of a Superclass

 superclass�� ȣ���ϱ� ���ؼ��� CallNonvirtual<type>Method�� �̿��Ѵ�. ������ ���� �ܰ踦 ��ġ�� �ȴ�.

 superclass�� �޼ҵ带 ȣ���ϴ� ���� ���� �߻������� �ʴ´�.

 Accessing Java Member Variables

 JNI���� instance�� class ������ ���ؼ� ������ �� �ִ� ����� �����Ѵ�. ������ ���� ���α׷��� �����Ѵ�.

 �� ���α׷��� String�� s�� int�� si�� ���� ����ϰ�, ���ο� ������ �����ϴ� ������ �����Ѵ�.

Procedure for Accessing a Java Member Variable

 native ���α׷��� ������ ����.

 Java ��� �����κ��� ���� ���ų� �����ϴ� ����� ������ ���� ����� ������ �ȴ�.

 Member Variable Signatures

 Calling Java Method �忡�� �����Ǿ��� Java VM Type Signatures�� �����Ѵ�.

 Handling Java Errors from Native Methods

 JNI������ native ���α׷������� ���� ������ �߻����� ��, �̰��� �ڵ鸵�� �� �ִ� ����� �����Ѵ�. C�� ���� �׷��� ����� �������� �ʴ� ���� �����ϰ� �̿�� �� �ִ�.
 ������ ������ ���� ó���� �����ֱ� ���� Java ���α׷��̴�.

 native �Լ��� catchThrow() �� try���� ������, ���ܻ����� �߻����� ��쿡 Exception �̺�Ʈ�� �Ѱ� �־�� �Ѵ�. callback() �Լ��� Exception �̺�Ʈ�� �߻���Ű���� �Ǿ� �ִ�.
 ���� ������ �̿� �����ϴ� C ���α׷��̴�.

 ���ܻ����� ������ �� �ִ� �Լ��� ExceptionOccurred() �̴�. if(exc) {��} �� ������ ���ܻ����� �߻����� ��쿡 ó���� �� �����̴�. ExceptionDescribe() �Լ��� ȣ���ؼ� ����� �޽����� ����ϰ� �ǰ�, ExceptionClear() �� ȣ���ؼ� Ŭ�������ش�. �� ���Ŀ� ���ο� ���ܻ����� �߻���Ű���� �Ǿ� �ִµ�, IllegalArgumentException Ŭ������ ã�Ƽ� ThrowNew() �� ���� Exception �̺�Ʈ�� �߻���Ų��.

Local and Global References

 JNI�� �⺻������ ��ü�� ���� ���۷����� ������ ��, ���� ���۷����� �����Ѵ�. �� ������� �������� ���, native �Լ��� ������ �ϰ� �Ǹ�, �� ���۷����� �����Ǿ� ������. �׷��� �Ǹ�, ������ �ٽ� Java ���α׷����� �� native �Լ��� ȣ���ؼ�, ��ü�� ���� ���۷����� �Ҵ�������� �ص�, �̹� �����Ǿ� �����Ƿ�, ����� �� ���� �Ǿ� ������. �̰��� �����ϱ� ���ؼ� �۷ι� ���۷����� �̿��ؾ� �Ѵ�.
 ���� ������ �ٷ� �տ� �忡�� ���Ҵ� ������ �����ؼ� �۷ι� ���۷����� �Ҵ��ϴ� ���� �����ش�.

 �۷ι� ���۷����� Java Ŭ������ unload���� ���ϰ� �ϱ� ������, ��� ���� ID�� �״�� �����ְ� �ȴ�. �׷�����, �� �̻��� �ʿ䰡 ���� ��쿡�� �ݵ�� DeleteGlobalRef() �Լ��� �̿��ؼ� ������ �־�� �Ѵ�. ���δ� DeleteLocalRef() �Լ��� �̿��ؼ� ���� ���۷����� ������ �־�� �� ��찡 �����. �׷��� ���� ������ ����.

 ���� ���κ��� Ȯ���� ����.

 Threads and Native Methods

Java�� ��Ƽ������ �ý����̴�. �̷��� �� ������, native �޼ҵ�� �������̾�� �Ѵ�. critcal ������ ������ ������ �� ��쿡�� ����ȭ�� �� �ִ� ����� ����Ǿ�� �Ѵ�.

 Threads and JNI

 �� ���� �����ؾ� �� ���� �ִ�.

 Thread Synchronization in Native Methods

 ����ȭ�� �� ���� ������� ����� �� �ִ�. ���� Java����, synchronized ������ ����ϴ� ����� �����غ� �� �ִ�.

 native �ڵ忡���� MonitorEnter() �� MonitorExit() �� �̿��Ѵ�.

Wait and Notify

Object.wait, Object.notify, Object.notifyAll�� ���� ����ȭ ����� �̿��� �� �ִ�. JNI������ ���������� ���������� ������, JNI �޼ҵ� ȣ�� ����� �̿��ؼ� �̸� ������ �� �ִ�.

 JNI Programming in C++

 C++�� �̿��ϸ� �� ��Ȯ�� �������̽��� JNI�� ����� �� �ִ�. ���� ���, C������ Ŭ������ ã�� ���ؼ� ������ ���� ����� ����ؾ� �Ѵ�.

 ��ſ�, C++������ ����ó�� �̿��� �� �ִ�.

 C++������ env ���ڰ� �����ȴ�. jni.h ���Ͽ����� C++������ jobject Ÿ�Կ� ���ؼ� ������ ���� ������ �ξ���.

 C++ �����Ϸ��� ������� ��쿡��, C�������� ������ Ÿ�� üũ�� �� �� �ִٴ� ������ ������ �ִ�. �� ���� �����ؾ� �� �����̶��, Ÿ�� ij������ �� �ʿ䰡 �ִ� ����̴�. ���� C���� ����ϴ� ȣ���� ���,

C++������ ������ ���� ������� ȣ���� ���̴�.

�̴� GetObjectArrayElement() �� ���ϰ��� jobject�ε�, jsring�� �̰��� ����Ÿ���̱� ������, ij������ �� �־�� �Ѵ�.