티스토리 뷰
1. JNI 변수 타입
JNI 변수 타입은 Java의 변수를 C++/C 에서 사용 할수 있게끔 호환해주는 변수 타입이다.
jni.h를 인클루드하면 사용이 가능한데 자세한 정보는 아래의 표를 보면 알 수 있다.
JAVA |
C++/C |
C++/C 배열 |
boolean |
jboolean |
jbooleanArray |
byte |
jbyte |
jbytArray |
char |
jchar |
jcharArray |
short |
jshort |
jshortArray |
int |
jint |
jintArray |
long |
jlong |
jlongArray |
float |
jfloat |
jfloatArray |
void |
jvoid |
jvoidArray |
Object |
jobject |
jobjectArray |
String |
jstring |
jstringArray |
java의 기본 변수형은 c++/c언어에서는 j가 붙은 클래스로 제공된다. int -> jint로 객체를 선언해서 사용해주면 되고, 배열도 마찬가지로 j+자료형+Array 객체형태로 생성해서 사용하면 된다.
c++ 에서의 사용 예
void main() { jstring str; jint num; jobject obj; ... }
2. JNI 시그니처
JNI 시그니처를 사용하는 이유는 JAVA에서 생성한 클래스나 함수에 접근하기위해 C++/C에서 사용하는 구분자라고 보면 된다.
시그니처 |
Type |
B |
byte |
C |
char |
D |
double |
F |
float |
I |
int |
J |
long |
S |
short |
V |
void |
Z |
boolean |
L클래스_이름 |
패키지 경로/ 클래스 이름 |
[ type |
type[] 배열 |
public class aa { public int testInt(int a) {return a;} public String testString(String a) {return a;} }
위와같은 java 소스에서 aa클래스 안에는 int testint(int) 메서드와 String testString(String) 메서드가 있다.
c++에서 위의 메서드를 콜하기 위해서는 아래와 같은 문법으로 접근해야한다.
void main() { jclass cls = (*env)->GetObjectClass(env, obj); jmethodID testInt = (*env)->GetMethodID(env, cls, "testInt", "(I)I"); jint jnum = (*env)->CallIntMethod(env, obj, testInt, num); jmethodID testString = (*env)->GetMethodID(env, cls, "testString", "(Ljava.lang.String;)Ljava.lang.String;"); jstring jstr = (*env)->CallObjectMethod(env, obj, testString, str); }
GetMethodID()를 이용하여 java함수를 콜할수 있는데 JvmEnv, jclass, "함수명", 시그니처가 매개변수로 들어간다. aa클래스를 담고있는 jclass와 함게 함수명 "testInt" 그리고 시그니처 (I)I 를 넣어줘야 위의 Java에서 생성한 int testInt(int)를 가져올 수 있다.
String 형 같은 경우에는 기본 변수타입이 아니기때문에 Object형식으로 접근해야한다. Ljava.lang.String;으로 시그니처를 입력해야하는데 주의할 점은 ; 세미클론을 빼먹을 경우 인식을 하지 못한다. 이점 유의해서 사용하길 바란다.
String형과같은 Object형을 함수에서 return시키거나 input시킬때에는 해당 클래스의 임포트 경로를 입력해주면된다. 간단하져?
'C++' 카테고리의 다른 글
OCI와 OCCI 그리고 버그,, (0) | 2018.08.18 |
---|---|
JNI를 이용하여 JAVA함수를 C++에서 사용해보자 (구현) JNI INVOKE (3) | 2018.08.10 |
JNI를 이용하여 JAVA함수를 C++에서 사용해보자 (셋팅) JNI INVOKE (0) | 2018.08.03 |
OSI 7계층, TCP/IP 4계층 (0) | 2018.05.17 |
[C++] 가상함수 (Virtual) (0) | 2018.05.14 |
- Total
- Today
- Yesterday
- HTTPie
- 대항해시대
- 정보처리기사 실기 후기
- 정보처리기사 2018 2회
- 다클 코드
- 다클 빈
- EACCES: permission denied
- 폴더선택다이얼로그
- JNI 시그니처
- 대항해시대 다음 런처
- 데스큐어
- 위대한 쇼맨
- JNI SIGNITURE
- 위대한 쇼맨 후기
- 대항해시대 넷마블 런처
- 대항해시대 런처
- 정처기 실기
- 빈파일
- React.js
- JNI
- lxd
- vite.js
- 구글 클라우드 플랫폼
- 합격 후기
- 대항해시대 다클
- JNI INVOKE
- Linux
- 위대한 쇼맨 ost
- OSI 7Layer
- 대항해시대 로그인
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |