がおまる開発ブログ

cocos2d-xやlevelhelperを使って iPhone/Androidアプリの作り方を解説します

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

cocos2d-xからツイートする [Android版:JNI編]

前回はcocos2d-xからツイートする [Android版:簡易編]で簡単なツイート機能をお知らせしました。
今回はJNIというc++⇔Javaのやり取りが出来る機能を使ってみましょう。

今日お知らせするのは、c++→Javaという方向です。
Javaにあるメソッドを直接実行させてみましょう。

前回のサンプルに少し手を加えます。

class HelloWorld : public cocos2d::CCLayer {
public:
~HelloWorld();
HelloWorld();

private:
void twitterTapped();

};



#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#include "JNICalls/InterfaceJNI.h"
#endif

HelloWorld::HelloWorld()
{
CCSize s = CCDirector::sharedDirector()->getWinSize();

CCMenuItemImage* btnTwitter = CCMenuItemImage::create("btnTwitter_OFF.png",
"btnTwitter_ON.png",
this,
menu_selector(HelloWorld::twitterTapped));
CCMenu* menu = CCMenu::create(btnTwitter, NULL);
menu->setPosition(ccp(s.width/2, s.height/2));
this->addChild(menu);

}

void HelloWorld::twitterTapped()
{
CCString* sendMsg = CCString::create("つぶやきテスト");

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
InterfaceJNI::postMessageToTweet(sendMsg->getCString());
#endif

}



次にClassesに「JNICalls」フォルダを作成して、
その中に「InterfaceJNI.cpp」、「InterfaceJNI.h」ファイルを作成してください。
s_20130118_1.png


#ifndef __INTERFACE_JNI_H__
#define __INTERFACE_JNI_H__

#include "cocos2d.h"

class InterfaceJNI
{
public:
static void postMessageToTweet(const char *msg);

protected:

};

#endif // __INTERFACE_JNI_H__




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

// Eclipse側のパッケージ名とjavaファイル名を指定
#define CLASS_NAME "org/cocos2dx/lib/Cocos2dxActivity"
// 呼び出すメソッド名
#define METHOD_NAME "tweet"


using namespace cocos2d;

//static JavaVM *gJavaVM;
//static jmethodID mid;
//static jclass mClass;

void InterfaceJNI::postMessageToTweet(const char *msg)
{
JavaVM* jvm = JniHelper::getJavaVM();
int status;
JNIEnv *env;
jmethodID mid;

bool isAttached = false;

CCLog("Static postMessageToTweet");

// Get Status
status = jvm->GetEnv((void **) &env, JNI_VERSION_1_6);



if(status < 0)
{
//LOGE("callback_handler: failed to get JNI environment, " // "assuming native thread");
status = jvm->AttachCurrentThread(&env, NULL);
CCLog("Status 2: %d", status);
if(status < 0)
{
// LOGE("callback_handler: failed to attach " // "current thread");
return;
}
isAttached = true;
CCLog("Status isAttached: %d", isAttached);
}
//-----------------------------------------------------------

CCLog("Status: %d", status);

jclass mClass = env->FindClass(CLASS_NAME);

CCLog("jClass ");

mid = env->GetStaticMethodID(mClass, METHOD_NAME, "(Ljava/lang/String;)V");
jstring stringArg = env->NewStringUTF(msg);
CCLog("mID: %d", mid);

if (mid!=0)
env->CallStaticVoidMethod(mClass, mid, stringArg);

CCLog("Finish");
if(isAttached)
jvm->DetachCurrentThread();

return;
}


7行目にEclipse側で呼び出すパッケージ名とjavaファイル名を指定します。
メソッド名も指定してね〜

// Eclipse側のパッケージ名とjavaファイル名を指定
#define CLASS_NAME "org/cocos2dx/lib/Cocos2dxActivity"
// 呼び出すメソッド名
#define METHOD_NAME "tweet"


51行目でクラスをみつけろ〜

jclass mClass = env->FindClass(CLASS_NAME);

55行目でメソッド名と引数を指定します。
今回はStringを渡したいのでこんな指定。(Ljava/lang/String;)V
最後の「V」は「void」っていう意味だってさ。
他にもあるから気になる人はググレカス

56行目で文字列をUTFに変換するぜ!

mid = env->GetStaticMethodID(mClass, METHOD_NAME, "(Ljava/lang/String;)V");
jstring stringArg = env->NewStringUTF(msg);

60行目で実行!

if (mid!=0)
env->CallStaticVoidMethod(mClass, mid, stringArg);

次はEclipseを編集っす!
あちこち行って申し訳ございませんm(_ _)m
s_20130116_3.png


public abstract class Cocos2dxActivity extends Activity implements Cocos2dxHelperListener {
/////省略////
private static Cocos2dxActivity myActivity;

@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

this.mHandler = new Cocos2dxHandler(this);

// Activityを保持する
myActivity = this;

this.init();

Cocos2dxHelper.init(this, this);
}

// InterfaceJNI.cppで設定したメソッド名が呼ばれる
public static void tweet(String msg)
{
Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT, msg);
myActivity.startActivity(intent);

}



つぶやきボタンを押すと下記のようにダイアログが表示されます。
JNIを使って、前回よりも更にややこしい事になってます。
無理やったら、簡易編でやることをおすすめしますね。

s_20130116_0.png

s_20130116_1.png

s_20130116_2.png
スポンサーサイト

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://gaomar.blog.fc2.com/tb.php/11-2b4c31a1
この記事にトラックバックする(FC2ブログユーザー)

FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。