Cocos2dx에서 Android 진동함수(Vibrator) 호출방법


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


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

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


[ Header File ]

#include "cocos2d.h"


USING_NS_CC;

using namespace std;


class DeviceServices

{

public:

DeviceServices();

~DeviceServices();


public:

static void callVibrator(const int &iValue);

}



[ 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::callVibrator(const int &iValue)

{

cocos2d::JniMethodInfo t;

if (cocos2d::JniHelper::getStaticMethodInfo(t, AppActivityClassName, "jniCallVibrator", "(I)V"))

{

jint value = iValue

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

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

}

}

#else



함수를 잠깐 설명하자면 callVibrator(const int &iValue)

여기에 iValue에 들어가는 숫자가 실제 Android device에서 진동할 크기입니다.


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


뭐 이렇게 하면 끝.

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

필요한 함수에서 그냥 DeviceServices::callVibrator() 를 호출하면 됩니다.


#include "DeviceServices.h"


void MainScene::underAttack()

{

int VibratorStrongValue = 20;

DeviceServices::callVibrator(VibratorStrongValue);

}



간단하지요?

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


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

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


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


public class AppActivity extends Cocos2dxActivity {

// main

private static AppActivity _appActiviy;


// vibrate 

Vibrator mVibrator = null;

int mVibratorPower = 20;


@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);


_appActiviy = this;

}


// call vibrator

public void vibrateEffect() {

mVibrator.vibrate(mVibratorPower);

}


public static void jniVibrateEffect(int power) {

_appActiviy.mVibratorPower = power;

_appActiviy.runOnUiThread(new Runnable(){

@Override

public void run() {

_appActiviy.vibrateEffect();

}

});

}

}



아참, AndroidManifest.xml 에 진동권한을 주는거 꼭 하셔야됩니다.

<uses-permission android:name="android.permission.VIBRATE" />


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