native 메쏘드 작성
com.package.Myclass
public class Myclass {
public native static void myMethod();
};
헤더 작성 : javah
빌드된 폴더로 이동.
이클립스의 경우 bin
$ javah -jni -classpath ./classes -o ../jni/sample.h com.package.Myclass
-jni : jni 스타일 헤더 생성
-classpath : 클래스 위치
-o : 출력 파일명 ( 디렉토리만 지정할 경우 -d )
기본 데이터 타입
typedef unsigned char jboolean; /* unsigned 8 bits */
typedef signed char jbyte; /* signed 8 bits */
typedef unsigned short jchar; /* unsigned 16 bits */
typedef short jshort; /* signed 16 bits */
typedef int jint; /* signed 32 bits */
typedef long long jlong; /* signed 64 bits */
typedef float jfloat; /* 32-bit IEEE 754 */
typedef double jdouble; /* 64-bit IEEE 754 */
문자열 처리
// jstring -> char
const char str = env->GetStringUTFChars( jstring_arg, 0 );
env->ReleaseStringUTFChars( jstring_arg, str );
env->GetStringLength( jstring_arg );
// char -> jstring
char str[12]="12345";
env->NewStringUTF( str );
배열
( jbyteArray , jintArray 등은 포인터)
// array -> pointer
jbyte *pt= env->GetByteArrayElements( array_arg, NULL );
env->ReleaseByteArrayElements( array_arg, pt, 0 );
// jbyteArray 생성
jbyteArray jbyteArrayv_arg = env->NewByteArray( length );
// char[] -> jbyteArray
char* str = "test";
env->SetByteArrayRegion( jbyteArray_arg, 0, strlen(str), (jbyte*)str);
// jintArray -> jint 배열에 복사
jint buf[8];
env->GetIntArrayRegion( jintArray_arg, 0, 8, buf);
// 길이
env->GetArrayLength( array );
클래스
시그니처
B : byte
C : char
D : double
F : float
I : int
J : long
S : short
V : void
Z : boolean
Lclass; : class명;(세미콜론 있어야함)
[시그니처 : 해당 타입 배열
(인자)반환타입 : int getValue() 의 경우 -> (V)I
// 클래스명으로 찾기
jclass cls = env->FindClass( "com/package/Class" );
// 오브젝트에서 클래스 얻기
jclass cls = env->GetObjectClass( obj );
// 메쏘드 찾고 실행
jmethodID method = env->GetStaticMethodID( cls, "메쏘드명", "(Ljava/lang/String;)I" );
jint ret = env->CallStaticIntMethod( cls, method, "인자");
// 필드 찾기
jfieldId fid = env->GetFieldID( cls, "필드명", "Ljava/lang/String;");
env->GetObjectField( obj, fid );
env->SetObjectField( obj, fid, value);
// 생성자로 객체 생성
jclass cls = env->FindClass("클래스명");
jmethodID method = env ->GetMethodID( "<init>", "()V");
jobject object = env->NewObject( cls, method );
클래스 레퍼런스 제거
env->DeleteLocalRef( cls );
'프로그래밍 > JAVA' 카테고리의 다른 글
힙 덤프 명령 (0) | 2017.02.23 |
---|---|
AES 암호화 (0) | 2014.03.27 |
[OSGi] 서비스 등록 및 해제 (0) | 2014.03.21 |
[eclipse] eclipse 4 platform (0) | 2014.03.17 |
Annotation (0) | 2014.03.15 |
[swt] 이벤트 (0) | 2014.03.14 |
[eclipse] Extention Points (0) | 2014.03.14 |
[eclipse] simple plug-in example (0) | 2014.03.13 |
Apache HttpClient 관련 정리 (0) | 2014.03.11 |
[JAVA TV] MHP 배경이미지 처리 (0) | 2013.12.27 |