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();
}
});
}
}
이걸 활용하면 진동호출이라던지 문자보내기 메일쓰기 뭐 등등등 다 되니 한번쯤 사용해보세요.
'개발 > 코딩' 카테고리의 다른 글
인디게임 개발 Extern 변수 사용해 보기 (C++) (0) | 2016.11.04 |
---|---|
인디게임 무료 배경음 사이트 (3) | 2016.11.04 |
인디게임 개발에 필요한 무료이미지 사이트 (0) | 2016.11.04 |
[Coco2dx 개발이야기] 코코스2dx에서 Android 진동함수(Vibrator) 호출하는 방법 (0) | 2016.11.03 |
안드로이드 INSTALL_FAILED_CONFLICTING_PROVIDER 문제해결방법 / 페이스북 앱 ID (2) | 2016.10.07 |
[pugi xml 사용방법 2탄] pugi xml 사용하기 (pugi xml 메니져 만들기) (0) | 2016.10.05 |
[pugi xml 사용방법 1탄] pugi xml 다운로드 및 import 하기 (android cocos2dx 개발 xml 사용방법 / pugi xml / pugi xml node (0) | 2016.10.05 |
[코코스2d 이야기] 코코스 2dx에서 font 동적생성 및 outline 사용방법 (0) | 2016.10.05 |
최근댓글