Cocos2dx 에서 Android JNI 호출 방법


코코스2로 앱을 개발하면서 간혹 Android 함수를 호출하고 싶을때가 있습니다. 이럴때에는 서비스클래스를 하나 만들어두고사용하면 나중에 또 다른 앱을 개발할때 바로 가져다 쓸 수 있어서 여러모로 편리합니다. Cocos2dx 에서 (C++개발환경)에서 Android 함수를 호출하는 방법은 아래와 같습니다. 가장 많이 쓰이는 Toast 메시지를 출하는 방법을 예로 들어보고자합니다.


저는 Servie class 를 만들어서 사용합니다. 클래스 이름은 DeviceServices 요렇게 지었어요.

먼저 C++ 파트를 적어볼께요.


[ Header File ]

#include "cocos2d.h"


USING_NS_CC;

using namespace std;


class DeviceServices

{

public:

DeviceServices();

~DeviceServices();


public:

static void showToastMessage(const std::string &iMsg);

}



[ Source File ]

#pragma execution_character_set("utf-8")

#include "DeviceServices.h"


DeviceServices::DeviceServices(){}

DeviceServices::~DeviceServices(){}


#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)


#include "platform/android/jni/JniHelper.h"

#include <jni.h>


const char* AppActivityClassName = "com/eyen/cpp/AppActivity";


void DeviceServices::showToastMessage(const std::string &iMsg)

{

cocos2d::JniMethodInfo t;

if (cocos2d::JniHelper::getStaticMethodInfo(t, AppActivityClassName, "jniShowToastMessage", "(Ljava/lang/String;)V"))

{

jstring word = t.env->NewStringUTF(iMsg.c_str());

t.env->CallStaticVoidMethod(t.classID, t.methodID, word);

t.env->DeleteLocalRef(t.classID);

}

}

#else



함수를 잠깐 설명하자면 showToastMessage(const std::string &iMsg)

여기에 iMsg에 들어가는 문자열이 실제 Android device에서 보여줄 문자열입니다.


"jniShowToastMessage" 요거는 뒤에 나오는 Java쪽에서 구현할 함수 이름이구요


뭐 이렇게 하면 끝.

Cocos2dx (C++)에서 호출 방법은 정말 간단합니다. 구현한 서비스 클래스를 include 해주고요, 

필요한 함수에서 그냥 DeviceServices::showToastMessage("반가워요") 를 호출하면 됩니다.


#include "DeviceServices.h"


void MainScene::welcome()

{

DeviceServices::showToastMessage("반가워요");

}



간단하지요?

이렇게 서비스클래스로 만들어 놓으면 다음에 다른 앱을 개발할때에도 그냥 저 DeviceServices 클래스 파일만 import 해서 사용하면 되므로 개발 시간이 많이 단축됩니다.


자 다음으로 Java 클래스를 구현해야 하는데 이것도 간단해요. Jni 콜 규칙만 알면 끝!

아래처럼 구현해 주면 됩니다^^


붉은생으로 마킹된 jniShowToastMessage 함수가 Cocos2dx (C++)에서 호출되는 함수입니다.


public class AppActivity extends Cocos2dxActivity {

// main

private static AppActivity _appActiviy;


// toast message

String mToastMessage;


@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);


_appActiviy = this;

}


  // show toast message

public void showToastMessage() {

Toast.makeText(getContext(), mToastMessage, Toast.LENGTH_SHORT).show();

}


  // Jni call from Cocos2dx

public static void jniShowToastMessage(final String iWord) {

_appActiviy.mToastMessage = iWord;

_appActiviy.runOnUiThread(new Runnable(){

@Override

public void run() {

_appActiviy.showToastMessage();

}

});

}


}



이걸 활용하면 진동호출이라던지 문자보내기 메일쓰기 뭐 등등등 다 되니 한번쯤 사용해보세요.