cocos2d-xとネイティブ間の連携  株式会社TKS2 清水友晶
清水 友晶—  株式会社TKS2  スマートフォンアプリ開発  (iOS, Android, Windows Phone 8)  Webコンテンツ開発—  cocos2d-xへの開発参加  cocos2d-xを利用したアプリ開発  講演活動...
—  http://cocos2d-x.jp—  cocos2d-x開発元Chukong Technologies社公認—  cocos2d-xのための自由なコミュニティー—  入門者から上級者まで誰でもOK!!ぜひご参加を!—  c...
—  現在のshinjuku.cocos2d-xハンズオンの問題点 —  Macユーザのみを対象としている。 —  徐々にレベルが上がってきているため初心者ついて   これない。—  将来のshinjuku.cocos2d-xハンズオン...
—  3/14 第6回 shinjuku.cocos2d-x—  3/21 shinjuku.cocos2d-x初心者ハンズオン      ∼MacでAndroidアプリを作ろう!∼—  3/22 cocos2d-x公開講座 in 鹿児島...
目次—  cocos2d-xとネイティブ間の連携の概要—  C++からObjective-Cへのアクセス—  C++からJavaへのアクセス—  Objective-CからC++へのアクセス—  JavaからC++へのアクセス—  ...
cocos2d-xとネイティブ間の連携の概要—  各OSの機能を利用するには必要となる —  言語設定・国コード・識別コード(ユーザ, 端末) —  ブラウザ・カメラ・マイク・アプリ内課金—  連携は各OS毎に実装が必要 —  coc...
CocosDenshionの連携方法       Android	                           iOS	                   SimpleAudioEngine.h	  SimpleAudioEngine...
C++からネイティブへのアクセス—  共通のクラスにより各OSの差異を吸収する—  実装はOS毎で用意する—  CCApplication::getCurrentLanguage()を参照             Android	    ...
C++からObjective-Cへのアクセス—  .mm形式であればC++とObjective-Cを混在させるこ とができるため比較的容易—  C++の実装部に、Objective-CによりiOSの機能を記述 することが可能
C++からJavaへのアクセス—  JNI(Java Native Interface)を利用する—  JNIとは、Javaプラットフォームにおいて、Javaで記  述されたプログラムと、他の言語(たとえばCやC+  +など)で書かれた、実...
ネイティブからC++へのアクセス—  ccTouches 関数を参照         Android	                                       iOS	      Cocos2dxRenderer.java...
ネイティブからC++へのアクセス—  あらかじめDelegateクラスに呼び出される関数をセッ トしておき、ネイティブから要求があるときにこの関 数を呼び出す—  各OSの差異を吸収するため次のクラスが用意されてい る —  CCTouc...
Objective-CからC++へのアクセス—  .mm形式であればC++とObjective-Cを混在させるこ とができるため比較的容易—  タッチイベントを受けるために次のクラスを用意 —  CCEGLViewProtocolクラス ...
JavaからC++へのアクセス—  JNIを利用する—  タッチイベントを受けるために次のクラスを用意 —  Cocos2dxRendererクラス—  JavaからJNIで定義された関数を呼び出すには、Java のクラスにおいて同じ関...
ネイティブ間連携を 試してみよう! デバイス名を取得する
デバイス名を取得する      Android	                           iOS	                  DeviceInformation.h	 DeviceInformation.cpp	      ...
DeviceInformation.h#ifndef _DEVICE_INFORMATION_H_!#define _DEVICE_INFORMATION_H_!!#include <stddef.h>!!class DeviceInforma...
DeviceInformation.mm#include "DeviceInformation.h"!#include "DeviceInformation_objc.h"!!static char const* static_GetDevic...
DeviceInformation_objc.h#import <Foundation/Foundation.h>!!@interface DeviceInformationObjc : NSObject!!+ (char const*)get...
DeviceInformation_objc.cpp#import "DeviceInformation_objc.h"!#include <sys/sysctl.h>!!@implementation DeviceInformationObj...
DeviceInformation.cpp#include "DeviceInformation.h"!#include "DeviceInformationJni.h"!!char const* DeviceInformation::getD...
DeviceInformationJni.h#ifndef __DEVICE_INFORMATION_JNI__!#define __DEVICE_INFORMATION_JNI__!!#include <jni.h>!!extern "C"!...
DeviceInformationJni.cpp#include   "DeviceInformationJni.h"!#include   <jni.h>!#include   "platform/android/jni/JniHelper....
DeviceInformation.javapackage net.tks2.sampleproject;!!import org.cocos2dx.lib.Cocos2dxActivity;!import android.os.Build;!...
おわり—  次回、cocos2dxにおけるBox2Dの利用方法および 便利なツールを紹介します。—  ありがとうございました。
Upcoming SlideShare
Loading in...5
×

cocos2d-xとネイティブ間の連携

23,084

Published on

cocos2d-xとネイティブ間の連携

Published in: Technology
1 Comment
17 Likes
Statistics
Notes
  • 清水さんが講師の、大好評イベントの第7回、開催します! 【#TechBuzz】第7回Shinjuku.cocos2d-x 〜少人数ハンズオン勉強会〜 cocos2d-xにおけるBox2Dの利用方法および便利なツールの紹介 ★残り席数わずかです!お申込はお早めに!!★⇒ http://atnd.org/events/37571
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total Views
23,084
On Slideshare
0
From Embeds
0
Number of Embeds
5
Actions
Shares
0
Downloads
49
Comments
1
Likes
17
Embeds 0
No embeds

No notes for slide

cocos2d-xとネイティブ間の連携

  1. 1. cocos2d-xとネイティブ間の連携 株式会社TKS2 清水友晶
  2. 2. 清水 友晶—  株式会社TKS2 スマートフォンアプリ開発 (iOS, Android, Windows Phone 8) Webコンテンツ開発—  cocos2d-xへの開発参加 cocos2d-xを利用したアプリ開発 講演活動 執筆活動—  Twitter: tks2shimizu—  Blog: http://tks2.net/memo—  SlideShare: http://www.slideshare.net/doraemonsss—  Facebook: http://www.facebook.com/doraemonsss
  3. 3. —  http://cocos2d-x.jp—  cocos2d-x開発元Chukong Technologies社公認—  cocos2d-xのための自由なコミュニティー—  入門者から上級者まで誰でもOK!!ぜひご参加を!—  cocos2d-xに関することなら何でも投稿できます!!—  https://www.facebook.com/groups/152840204871454/
  4. 4. —  現在のshinjuku.cocos2d-xハンズオンの問題点 —  Macユーザのみを対象としている。 —  徐々にレベルが上がってきているため初心者ついて これない。—  将来のshinjuku.cocos2d-xハンズオン —  Windowsユーザ, Macユーザを区別しない —  レベルはこのまま—  shinjuku.cocos2d-x初心者ハンズオン
  5. 5. —  3/14 第6回 shinjuku.cocos2d-x—  3/21 shinjuku.cocos2d-x初心者ハンズオン     ∼MacでAndroidアプリを作ろう!∼—  3/22 cocos2d-x公開講座 in 鹿児島—  3/23 cocos2d-x実践講座 in 鹿児島—  4/10 shinjuku.cocos2d-x初心者ハンズオン     ∼WindowsでAndroidアプリを作ろう!∼—  4/17 第7回 shinjuku.cocos2d-x—  5/M 第8回 shinjuku.cocos2d-x—  5/M shinjuku.cocos2d-x初心者ハンズオン     ∼MacでiOSアプリを作ろう!∼
  6. 6. 目次—  cocos2d-xとネイティブ間の連携の概要—  C++からObjective-Cへのアクセス—  C++からJavaへのアクセス—  Objective-CからC++へのアクセス—  JavaからC++へのアクセス—  ネイティブ間連携を試してみよう! —  デバイス名を取得する
  7. 7. cocos2d-xとネイティブ間の連携の概要—  各OSの機能を利用するには必要となる —  言語設定・国コード・識別コード(ユーザ, 端末) —  ブラウザ・カメラ・マイク・アプリ内課金—  連携は各OS毎に実装が必要 —  cocos2d-x(C++) çè Android(Java) —  cocos2d-x(C++) çè iOS(Objective-C)           :—  公式フォーラムで連携方法を聞くと、決まって 「CocosDenshionを見てね」と言われる
  8. 8. CocosDenshionの連携方法 Android iOS SimpleAudioEngine.h SimpleAudioEngine.cpp SimpleAudioEngine.mm SimpleAudioEngineJni.h SimpleAudioEngine_objc.h SimpleAudioEngineJni.cpp SimpleAudioEngine_objc.m CDAudioManager.h Cocos2dxHelper.java CDAudioManager.m Cocos2dx Cocos2dx Music.java Sound.java
  9. 9. C++からネイティブへのアクセス—  共通のクラスにより各OSの差異を吸収する—  実装はOS毎で用意する—  CCApplication::getCurrentLanguage()を参照 Android iOS CCApplication.h CCApplication.h CCApplication.cpp CCApplication.mm Java_org_cocos2dx_lib_Cocos2dx Helper.h Java_org_cocos2dx_lib_Cocos2dx Helper.cpp Cocos2dxHelper.java
  10. 10. C++からObjective-Cへのアクセス—  .mm形式であればC++とObjective-Cを混在させるこ とができるため比較的容易—  C++の実装部に、Objective-CによりiOSの機能を記述 することが可能
  11. 11. C++からJavaへのアクセス—  JNI(Java Native Interface)を利用する—  JNIとは、Javaプラットフォームにおいて、Javaで記 述されたプログラムと、他の言語(たとえばCやC+ +など)で書かれた、実際のCPUの上で動作するコー ド(ネイティブコード)とを連携するためのインタ フェース仕様 http://ja.wikipedia.org/wiki/Java_Native_Interface—  JNIを利用するクラスを用意する—  Javaで書かれたクラス上にAndroid SDKを用い Androidの機能を利用する
  12. 12. ネイティブからC++へのアクセス—  ccTouches 関数を参照 Android iOS Cocos2dxRenderer.java EAGLView.h TouchesJni.cpp EAGLView.mm CCEGLView.h CCEGLView.h CCEGLViewProtocol.h CCEGLView.cpp CCEGLView.cpp CCEGLViewProtocol.cpp CCTouchDispatcher.h CCTouchDelegate.h CCTouchDispatcher.cpp CCTouchDelegate.cpp CCLayer.h CCLayer.cpp
  13. 13. ネイティブからC++へのアクセス—  あらかじめDelegateクラスに呼び出される関数をセッ トしておき、ネイティブから要求があるときにこの関 数を呼び出す—  各OSの差異を吸収するため次のクラスが用意されてい る —  CCTouchesHandlerクラス —  CCTouchDelegateクラス —  CCTouchDispatcherクラス
  14. 14. Objective-CからC++へのアクセス—  .mm形式であればC++とObjective-Cを混在させるこ とができるため比較的容易—  タッチイベントを受けるために次のクラスを用意 —  CCEGLViewProtocolクラス —  EGLTouchDelegateクラス
  15. 15. JavaからC++へのアクセス—  JNIを利用する—  タッチイベントを受けるために次のクラスを用意 —  Cocos2dxRendererクラス—  JavaからJNIで定義された関数を呼び出すには、Java のクラスにおいて同じ関数名のメソッドをnativeで宣 言する必要がある—  JNIからCCDispatcherクラスを呼び出す
  16. 16. ネイティブ間連携を 試してみよう! デバイス名を取得する
  17. 17. デバイス名を取得する Android iOS DeviceInformation.h DeviceInformation.cpp DeviceInformation.mm DeviceInformationJni.h DeviceInformation_objc.h DeviceInformationJni.cpp DeviceInformation_objc.m DeviceInformation.java
  18. 18. DeviceInformation.h#ifndef _DEVICE_INFORMATION_H_!#define _DEVICE_INFORMATION_H_!!#include <stddef.h>!!class DeviceInformation!{!public:! static char const* getDeviceName();!};!!#endif // _DEVICE_INFORMATION_H_!
  19. 19. DeviceInformation.mm#include "DeviceInformation.h"!#include "DeviceInformation_objc.h"!!static char const* static_GetDeviceName()!{! return [DeviceInformationObjc getDeviceName];!}!!char const* DeviceInformation::getDeviceName()!{! return static_GetDeviceName();!}!
  20. 20. DeviceInformation_objc.h#import <Foundation/Foundation.h>!!@interface DeviceInformationObjc : NSObject!!+ (char const*)getDeviceName;!!@end!
  21. 21. DeviceInformation_objc.cpp#import "DeviceInformation_objc.h"!#include <sys/sysctl.h>!!@implementation DeviceInformationObjc!!+ (char const*)getDeviceName {! size_t size;! sysctlbyname("hw.machine", NULL, &size, NULL, 0);! char *machine = malloc(size);! sysctlbyname("hw.machine", machine, &size, NULL, 0);! NSString *platformName = [NSStringstringWithCString:machine encoding:NSUTF8StringEncoding];! free(machine);! ! return [platformName UTF8String];!}!!@end!
  22. 22. DeviceInformation.cpp#include "DeviceInformation.h"!#include "DeviceInformationJni.h"!!char const* DeviceInformation::getDeviceName()!{! return getDeviceNameJNI();!}!
  23. 23. DeviceInformationJni.h#ifndef __DEVICE_INFORMATION_JNI__!#define __DEVICE_INFORMATION_JNI__!!#include <jni.h>!!extern "C"!{! extern char const* getDeviceNameJNI();!}!!#endif // __DEVICE_INFORMATION_JNI__!
  24. 24. DeviceInformationJni.cpp#include "DeviceInformationJni.h"!#include <jni.h>!#include "platform/android/jni/JniHelper.h"!#include "cocoa/CCString.h"!!#define CLASS_NAME "net/tks2/sampleproject/SampleProject"!!using namespace cocos2d;!using namespace std;!!extern "C" {! const char* getDeviceNameJNI() {! JniMethodInfo t;! ! if (JniHelper::getStaticMethodInfo(t, CLASS_NAME, "getDeviceName", "()Ljava/lang/String;")) {! jstring str = (jstring)t.env->CallStaticObjectMethod(t.classID, t.methodID);! t.env->DeleteLocalRef(t.classID);! CCString *ret = new CCString(JniHelper::jstring2string(str).c_str());! ret->autorelease();! t.env->DeleteLocalRef(str);! ! return ret->m_sString.c_str();! }! ! return 0;! }!}!
  25. 25. DeviceInformation.javapackage net.tks2.sampleproject;!!import org.cocos2dx.lib.Cocos2dxActivity;!import android.os.Build;!import android.os.Bundle;!!public class SampleProject extends Cocos2dxActivity{! protected void onCreate(Bundle savedInstanceState){! super.onCreate(savedInstanceState);! }! ! static {! System.loadLibrary("game");! }! ! public static String getDeviceName() {! return Build.MODEL;! }!}!
  26. 26. おわり—  次回、cocos2dxにおけるBox2Dの利用方法および 便利なツールを紹介します。—  ありがとうございました。
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×