본문 바로가기

프로그래밍/JAVA

jni 관련~

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