9월, 2012의 게시물 표시

cocos2d-x JNI를 가지고 android에서 Native Code(C/C++) < - > Java 양방향 호출해보자

이미지
cocos2d-x에 JIN를 사용해서 C/C++ <-> Java 양방향 호출을 알아보기 전에 간단하게 JNI가 무엇인지 리서치 해본 것을 먼저 정리해보겠습니다.

Java에서 특정 플랫폼에서 실행 가능한 네이티브 코드에 접근하기 위해 만들어진 API를 JNI(Java Native Interface)라고 합니다. Java에는 이미 많은 모듈들이 있지만 이것으로는 구현할 수 없거나, 조금더 Low Level단 Hardware접근이나 Performance를 요구할 때 해당 플랫폼에 종속된 언어, 예를 들자면  C/C++ 로 구현 된 모듈에 접근할 때 사용한다고 하네요.

cocos2d-x에서 JNI를 사용해야 할 때는 언제일까요? 먼저 Java에서 C/C++ 로는 뭐가 있을까요? In App Purphase에 대한 정보를 Java에서 게임에 반영할 때라던지 디바이스의 특정 정보를 게임으로 넘겨줄 때 등등이 그렇겠네요.

반대로  C/C++ 에서 Java로의 예는 어떤 외부 광고 모듈이 Android용 Java와 iOS용 Objective-C로 만들어져 있을 때 cocos2d-x가 그렇듯 개발중인 프로젝트에 중간에  C/C++ 로 매핑시켜 iOS에서는 Objective-C가 Android는 Java가 호출 되도록 할 수 있겠네요.

자이제 cocos2d-x의 Helloworld 샘플에 JNI를 사용하는 간단한 샘플을 적용해 보겠습니다. 먼저 Java -> Native Code(C/C++) Call 입니다.

cocos2d-x의 HelloWorld 샘플을 이클립스로 열어 src -> org.cocos2dx.application의 ApplicationDemo.java를 엽니다.

public class ApplicationDemo extends Cocos2dxActivity{ private Cocos2dxGLSurfaceView mGLView; protected void onCreate(Bundle savedInstanceState){ super.o…

AD fresca에 광고 노출 할 App 등록, API key 발급받기

이미지
먼저 관리자용 AD fresca 웹페이지에 로그인을 합니다.

로그인 후 대쉬보드에서 Add App나 Click here to add a new app.을 클릭합니다.

 Select Status에서 기존에 App이 이미 App Store등에 있다면 This app is launched and is available on App Store.를 선택하시고 아직 런칭되지 않은 App이라면 This App is not launched yet을 선택합니다. 여기서는 후자를 선택합니다.

Name에는 필수로 App의 이름을 입력하시고 Description에는 설명을 기입합니다. App Store에 반영되는 것이 아닌 관리차원에서 기입하는 것입니다.

App Store는 등록예정에 있거나 등록되어 있는 App Store를 선택합니다. 마지막으로 Create App을 클릭합니다.

신규 App을 AD fresca에 등록했습니다. API key도 발급이 되었습니다.해당 키로 iOS나 Android에 작업을 진행하면 됩니다.

cocos2d-x Android용 AD fresca 붙여보자

이미지
AD fresca Android SDK 다운 받아 적절한 위치에 압축을 해제합니다.

저는 진행 프로젝트의 proj.android에 풀었습니다.

Project -> Properties -> Java Build Path의 Libraries탭에서 Add External JARs를 선택후 AdFresca.jar 파일을 선택합니다
이제 Permission을 추가해야합니다. Uses Permission 추가는 링크를 참고하시어 ACCESS_NETWORK_STATE와 INTERNET 2개의 Permission을 추가해줍니다. AD fresca에서 사용자의 네트워크 접속 상태, 기기ID를 수집해 광고 매칭에 사용한다고 하네요. 수집된 데이터는 암호화 처리되어 전송되고 광고 매칭 이외에는 사용되지 않는다고 합니다.
준비과정이 끝났습니다. 이제 java 소스 파일을 수정해야 합니다. src안에 진행 중인 프로젝트의 java 소스파일을 더블클릭해 엽니다.

//먼저 adfresca를 import해주고 import com.adfresca.ads.*; public class projectxxx extends Cocos2dxActivity{ private Cocos2dxGLSurfaceView mGLView; protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); if (detectOpenGLES20()) { ..... ..... // Set framelayout as the content view setContentView(framelayout); //AdFrescaView 객체를 생성합니다. YOUR_APIKEY는 해당 App용으로 발급받은 키 AdFrescaView adView = AdFrescaView.sharedAdView(this, "YOUR_APIKEY"); //앱의 설치, 실행정보기록. 반드시 최초 …

Eclipse Android에 Uses Permissions 추가하기

이미지
Android 관련 개발시 여러가지 접근 권한을 풀어줘야할 때가 있습니다.
 프로젝트를 열어 AndroidManifest.xml을 더블클릭하면 오른쪽에 편집창이 열립니다. Permissions탭에서 Add -> Uses Permission을 선택합니다.
오른쪽 Permission Attributes창에서 콤보박스를 클릭해 원하는 Uses Permission을 선택하면 해당 Permission은 접근 권한이 생기게됩니다.

Eclipse Android Project에 외부 자바 라이브러리 jar파일 추가하기

이미지
External jar 파일을 진행중인 프로젝트의 원하시는 폴더에 넣습니다. 그리고 refresh 해보시면 간단하게 jar 파일을 프로젝트에 가져오게 됩니다.
아니면
 File -> Import나 프로젝트 우클릭 -> Import를 선택합니다.

 General -> File System 선택합니다.

 jar파일이 있는 폴더를 선택합니다.

Import할 jar파일을 선택후 Finish를 선택하면 jar파일이 추가됩니다. 다음으로 Build Path를 설정해야합니다.
Project -> Properties -> Java Build Path의 Libraries탭에서 Add External JARs를 선택후 방금 가져왔던 jar 파일을 선택합니다. 일단은 여기까지해서 추가가 되었습니다.

빌드 후 실행시 만약


09-24 14:27:21.069: E/AndroidRuntime(25045): FATAL EXCEPTION: main

09-24 14:27:21.069: E/AndroidRuntime(25045): java.lang.NoClassDefFoundError: com.adfresca.ads.AdFrescaView 09-24 14:27:21.069: E/AndroidRuntime(25045): at org..game..onCreate(xxx.java:82)
위와 같이 Class를 못 찾는 error 로그가 남으면서 컴파일은 잘 되지만 런타임 error가 발생한다면 아래와 같이 추가 작업을 해줍니다.

Order and Export탭으로 이동해 방금 추가했던 jar파일을 체크하고 저장합니다. 예전에는 이렇게 안해도 되었다는데, ADT가 업데이트 되고나서는 이렇게 해줘야 한다는군요.

이제 Clean -> Build하시면 됩니다.

Eclipse Text Editors에 Line Number 보기

이미지
이클립스도 다른 IDE와 마찬가지로 편집기에서 라인 넘버가 안보이네요. 보이기 위한 설정 작업을 정리합니다.
Window -> Preferences를 선택합니다. 맥은 Eclipse -> 환경설정 입니다.
General -> Editors -> Text Editors에서 Show line numbers를 체크합니다.

이제 이클립스 텍스트 에디터에 라인 번호가 왼편에 보입니다.

cocos2d-x iOS용 AD fresca 붙여보자

이미지
AD fresca는 iOS와 Android 둘다 지원하고 있습니다. 먼저 cocos2d-x에 iOS용 AD fresca를 붙이는 것을 정리해봅니다.

iOS AD fresca SDK Download
먼저 iOS용 AD fresca SDK를 다운받습니다. 아직 압축해서 1메가도 안되는 무지 작은 용량이네요.

적당한 위치에 압축을 풀어 역시나 정당한 위치에 SDK를 옮겨줍니다. 저는 일단 진행중인 프로젝트의 cocos2d-x ios xcode template로 만들면 자동으로 생성되는 libs폴더에 넣었습니다.

이제 SDK폴더를 진행중인 프로젝트의 Frameworks 폴더에 드래그&드롭 시켜서 추가시켜줍니다.

Project -> TARGETS -> Build Phases -> Link Binary With Libraries에서 +를 눌러 SystemConfiguration.framework 검색해 찾아 추가해줍니다.

마지막으로 TARGETS -> Build Settings -> Linking -> Other Linker Flags에 -ObjC를 추가해줍니다.

만약 -ObjC를 넣지 않으시면 추후 런타임시 AdFrescaView관련 소스 부분에서 위와 같이 문제가 발생할 수 있습니다.

준비작업은 이것으로 끝입니다. 이제 코딩작업을 진행합니다.


간단하게 AppController.mm에 작업해보겠습니다.

///< SDK h를 import해줍니다.

#import <AdFresca/AdFrescaView.h>

///< AD FrescaView를 초기화 합니다.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {     [AdFrescaViewstartSession:@"YOUR_API_KEY"];
초기화 시 YOUR_API_KEY가 나오는데 이것은 App마다…

AD Fresca? App개발자들끼리 누이좋고 매부좋게 해주는 국산 AD 플랫폼

이미지
만든 App을 광고하거나 홍보를 하려면 어떻게 해야할까요? 예전 같으면 피처폰 시절부터 있던 자뻑(자신, 만든회사에서 알바나 아는 모든 지인들을 동원해 직접 다운로드를 많이해 다운로드수를 늘리는 것)을 하던가 돈을 들여 포털 배너 광고를 하던가 했겠죠? 아니면 동영상을 만들어 올리던가 기사를 배포할 수도 있겠구요.
먼저 나열했던 것들은 뭐랄까 아날로그적 접근 방식이라고 개인적으로 생각이 되네요. 구시대적이라는 것이죠. 뭐 그렇다고 그게 잘 못되었다 라는건 아니죠. 하지만, 요즘은 어떤가요? 해외에는 Facebook, 국내에서는 카카오톡 등의 엄청난 유저풀을 자랑하고 있는 이용자기반 플랫폼들이 이미 준비되어있죠. 특히나 요즘은 카카오톡 게임 플랫폼의 힘을 직감할 수 있습니다. 그외에도 성격은 조금 다르지만 iOS의 Game Center, GREE, Scoreloop등도 있고 아니면 컴투스 Hub나 게임빌의 LIVE, CIRCLE와 같이 각 회사 자체개발 플랫폼이 있을 수 있겠죠.
아날로그적 접근 방식이었던 발로 뛰어야만 하는 광고 전략에서 벗어나 이런 소셜 네트워크의 이용자기반 플랫폼의 장점은 유저들에 의해 자동으로 광고 버프를 받을 수 있다는게 장점이 아닐까 생각합니다. 이용자들이 알아서 자신의 게임 진행상황을 자랑? 하기위해 서로 공유하다보면 소셜 네트워크의 장점을 활용해 게임은 자동으로 노출이 기하급수적으로 늘어나게 되는거죠.
여기서 물론 게임 자체도 재미가 있고 스마트인 만큼 짧은 시간에 쉽게 즐길 수 있게 접근성과 조작감도 좋아야 한다는 전제가 있겠죠. 꼭 이렇게 해야지만 성공하는 게임은 아니니 이것은 여기서 그만 논외로 하구요.
자 이제 이번 포스팅의 본론으로 들어가보면, 이와 관련된 플랫폼중에 하나가 AD fresca입니다. 본론에 들어가기에 앞서 전 절대 AD fresca직원이 아닙니다. 알아보니 제가 지금 속한 회사가 AD fresca와 협력업체네요. 그래서 AD fresca관련 작업을 제가 해야해서 간단히 리서치 내용을 포스팅 해봤습니다.

망할 SCPlugin Uninstall 해보자

이미지
cocos2d-x ios 프로젝트에 Framework도 static lib로 만들어봤겠다 이제 ios용 게임 프로젝트 파일들과 Framework static lib도 svn에 올려야지 해서 finder에서 commit을 시도중 SCPlugin이 저에게 Subversion Error 스팀팩을 선사하더군요.

스팀팩 3종 세트!


svn: Path '/Volumes/Macintosh HD 2/trunk/Projects/libFramework.a' is not a directory

'/Volumes/Macintosh HD 2/trunk/Projects/libFramework.a' is already under version control

Working copy '/Volumes/Macintosh HD 2/trunk' locked

뭐 이런저런 Subversion Error이 뜨더군요. truck는 lock하지도 않았는데 locked되서 SCPlugin에는 풀수있는 메뉴도 보이지도 않고....


심지어는 Xcode에서도 스팀팩 one + 를 선사해주더군요. 해서 그냥 SCPlugin 날려버리고 SourceTree를 써볼까 합니다.

일단 SCPlugin Uninstall 방법을 정리해봅니다.

먼저 finder에서 command + shift + G를 눌러 /Library/Contextual Menu Items 로 이동합니다.

SCFinderPlugin.plugin 이라는 플러그인을 삭제합니다.

마찬가지로 /Library/LaunchAgents 로 이동하셔서 org.tigris.scplugin.launch.plist를 삭제합니다.

다음으로 응용프로그램으로 가셔서 SCToolbarButton을 삭제 후 Mac OSX를 로그아웃하거나 재부팅합니다.

그러면 finder 도구막대 icon들 중에 SCToolbarButton.app라고 나오면서 기존과는 다르게 ?로 표시되는 놈이 있는데 이놈을 제거해야합니다. command + 마우스 클릭해서…

cocos2d-x 기존 c++로 만든 lib를 xcode ios용 static lib로 만들어서 게임프로젝트에 사용하기

이미지
cocos2d-x Android Framework lib는 완성을 했었고 cocos2d-x ios에서는 Framework를 lib까지 만들지는 않고 프로젝트에 직접 파일을 추가해서 빌드를 해봤었죠. 이제는 지난 포스팅에서 언급했듯이 Framework를 lib로 만들어서 개발할 수 있는 환경을 만들어보겠습니다.
이전 포스팅 내용과 연관되어있는 부분도 있고 제 개인 환경부분(폴더구조등)에 대한 설명이라 약간 노말하지 않을 수 있습니다. 이점 염두해 두시고 봐주세요.
 Xcode에서 new project -> iOS -> Framework & Library -> Cocoa Touch Static Library를 선택합니다.

 Product Name은 원하시는 것을 써주시고 저는 win32와 android static lib가 모두 Framework 였기에 이렇게 기입했습니다.

 svn으로 관리되고 있는 저희 프로젝트 폴더 구조인데요 역시나 win32나 android가 그랬듯 Engine의 하위에 생성되도록 해줍니다. 여기서 FrameworkSrc는 win32버젼과 Android.mk가 들어있는 폴더인데 Framework는 svn관리를 안하고 있어서 따로 복사해서 쓰려고 저렇게 준비를 해봤습니다.

 이렇게 하는 이유는 일단 같이 개발중인 팀원들에게 lib를 만들어 인터페이스만 공개할 것이기 때문입니다. 이게 아니라면 그냥 svn에 올렸을 테고 Framework 소스 복사 하는 과정은 없겠죠?

 기본 Framework static lib가 만들어졌습니다. 이제 win32에서 작업했던 cpp, h를 추가해줘야합니다.

 win32의 vcxproj나 user, stdafx.cpp, h등은 복사하지 않고 순수 구현된 소스 들만 폴더째로 복사했습니다.

 Add File to나 command + option + a 를 눌러 폴더째로 파일들을 추가합니다.

Framework 프로젝트에 파일들이 추가되었습니다. 이제 빌드를 해보면,

'cocoa/CCOb…