Cocos2d-x에서 java의 signature of a method를 알아내기

2012. 6. 21. 14:35프로그래밍/Cocos2dX

728x90
반응형

Cocos2d-x를 이용해서 C++/C에서 Java소스의 함수를 호출할때 자바 클래스내에 있는 함수의 고유식별자를 알아내야 합니다. 그래야 JNI를 통해서 호출이 가능합니다.

우선 간단하게 알아내는 방법은 JDK의 javap.exe를 이용하는 방법입니다.


@echo on

cd C:\Program Files\Java\jdk1.7.0\bin\

javap.exe -s C:\My_Work\Coco2DX\cocos2d-1.0.1-x-0.12.0\SVSZ\android\bin\classes\com\manodio\svsz\SVSZ.class


pause


일단 위와 같이 bat파일을 만들어서 사용해도 좋습니다. 

위 명령어를 실행하면 SVSZ.class내의 모든 함수들이 "(ILJAVA/LANG/STRING;[I)J" 등의 값으로 매칭되어 있는 것을 확인할수 있을겁니다. 그럼 그 값을 활용하시면 됩니다.



그리고 다음과 같이 C++소스에서 함수를 만들고 사용하면 됩니다. LOGD와 g_Env 그리고 g_jcls는 위에서 별도로 선언한 변수들입니다.

void doPlayLog(int MODE, int LEVEL, const char * STATE, const char * INFO)

{

//다음과 같이 로그를 남겨서 문제가 발생된 부분은 확인하고 해결해 나갑니다.

LOGD("COCOS2DX : C++ -> doManoServerPlayLog : ");


//다음과 같이 문장을 String형의 UTF로 변경해주셔야 정상적으로 전달이 됩니다.

jstring stringArg_STATE = g_Env->NewStringUTF(STATE);

jstring stringArg_INFO = g_Env->NewStringUTF(INFO);


//다음과 같이 함수를 호출합니다.

g_Env->CallStaticIntMethod(g_jcls, g_Env->GetStaticMethodID(g_jcls, "doPlayLog ", "(IIIILjava/lang/String;Ljava/lang/String;)I"),MODE, LEVEL, stringArg_STATE, stringArg_INFO);

}


위와 같은 방법으로 간단하게 C/C++ ->Java 또는 Java  -> C/C++ 의 함수 호출 그리고 결과 값 되돌려주기가 가능합니다.


728x90
반응형