2013의 게시물 표시

Cocos2d-x Plugin-X 맥에서 Android Publish를 위한 ant 기본 설치 패스 알아내기

이미지
Cocos2d-x 3.0alpha1에서 맥에서 안드로이드 플러그인 시스템 Publish를 해야 하는데 ant 위치를 설정해줘야 하는 부분에서 ant를 새로 설치해야 할까 하다가 리서치 해보니 역시 맥에는 기본으로 ant가 설치되어 있더군요. 그런데 대체 어디에 설치 되어있는지 알아야 한다는게 문제였습니다.

 일단 아래와 같이 ant -version을 실행하니 맥 OSX 마운틴 라이온에는 ant 1.8.2가 설치 되어있더군요. whereis 라는게 있는 걸 알게 되었고 whereis ant 하니 /usr/bin/ant에 있다는 군요.



 파인더에서 command + shift + g 키를 눌러 /usr/bin 폴더로 이동하니 ant가 보이는데 가상본입니다.



 마우스 우클릭 후 원본 보기를 누르니



 아래와 같이 /usr/share/java/ant-1.8.2/bin 에 있네요.



 ./publish.sh를 실행하면 아래와 같이 ant tool path 부분에 위 패스를 입력해주면 컴파일이 진행 됩니다.

Cocos2d-x No rule to make target `jni/helloworld/main.cpp', needed by `obj/local/armeabi/objs/cocos2dcpp_shared/helloworld/main.o'

make.exe: Entering directory `C:/Projects/cocos2d-x-3.0alpha1/projects/testgame/proj.android'
make.exe: *** No rule to make target `jni/helloworld/main.cpp', needed by `obj/local/armeabi/objs/cocos2dcpp_shared/helloworld/main.o'.  Stop.


 Cocos2d-x 빌드 중 위와 같이 에러가 발생했는데요, 제 실수긴 하지만 첨 나온 이슈라 정리를 해봅니다. Android.mk 파일을 수정하는데 있어 구버전은

LOCAL_SRC_FILES := helloworld/main.cpp \

 이렇게 되어있고 요즘 버전은

LOCAL_SRC_FILES := hellocpp/main.cpp \

 이렇게 되어있죠. main.cpp가 들어있는 폴더명을 잘 못 건들어서 발생했던 이슈였습니다.

Cocos2d-x Android.mk에서 LOCAL_SRC_FILES에 Classes 폴더의 cpp 자동 추가하기

이 팁은 이미 많은 분들이 알고 계실 듯 합니다. 작년에 정리할 때는 Android.mk 파일에 classes에 있는 cpp 파일들을 일일이 추가해야 한다고 했었는데요, 이게 영 불편한게 아니죠.

CLASSES_DIRECTORY := $(LOCAL_PATH)/../../Classes

SOURCE_FILES := $(shell find $(CLASSES_DIRECTORY) -name *.cpp)
SOURCE_FILES := $(sort $(SOURCE_FILES))
SOURCE_FILES := $(subst $(LOCAL_PATH)/,,$(SOURCE_FILES))

LOCAL_SRC_FILES := hellocpp/main.cpp \
                   $(SOURCE_FILES)

 기존 LOCAL_SRC_FILES를 위 내용으로 대체하면 자동으로 Classes 하위 폴더의 cpp를 검색해서 한번에 자동 추가할 수 있습니다. 맥에서 해봤는데 윈도우 Cygwin에서도 잘 될지는 아직 해보지 못했네요.

 위는 build_native.sh 인 버전 빌드할 때 였는데 파이썬 환경인 build_native.py을 윈도우 콘솔에서 하니 아래와 같은 에러가 발생하네요.

파일을 찾을 수 없습니다-*.cpp
...
[armeabi] Compile++ thumb: cocos2dcpp_shared <= main.cpp
[armeabi] SharedLibrary  : libcocos2dcpp.so
jni/hellocpp/main.cpp:15: error: undefined reference to 'AppDelegate::AppDelegat
e()'
collect2.exe: error: ld returned 1 exit status
make.exe: *** [obj/local/armeabi/libcocos2dcpp.so] Error 1

 이때는 아래와 같이 처리해줍니다.

FILE_LIST := $(wildcard $(LOCAL_PATH)/../..…

Cocos2d-x Plugin-X 적용 후 NDK 빌드 시 이슈들

이미지
Cocos2d-x 플러그인 시스템을 프로젝트에 적용 후 build_native.py로 NDK 빌드 중 몇가지 이슈가 있었습니다. 익숙한 것도 있고 아닌것도 있네요.


1. fatal error: PluginJniHelper.h: No such file or directory

[armeabi] Compile++ thumb: cocos2dcpp_shared <= main.cpp
jni/hellocpp/main.cpp:8:29: fatal error: PluginJniHelper.h: No such file or directory
 #include "PluginJniHelper.h"
                             ^
compilation terminated.
make.exe: *** [obj/local/armeabi/objs/cocos2dcpp_shared/hellocpp/main.o] Error 1

make.exe: Leaving directory `D:/cocos2d-x-3.0alpha1/projects/AdMobTestGame/proj.
android'


 뭐 ndk 빌드시 많이 봐왔던 에러죠. 진행중인 프로젝트의 Android.mk에 아래와 같은 것을 추가해주면 되죠.

LOCAL_WHOLE_STATIC_LIBRARIES += PluginProtocolStatic

$(call import-module,protocols/android)


2. Cannot find module with tag 'protocols/android' in import path

 하지만 다시 빌드해보면 오랜만에 NDK_MODULE_PATH 관련 오류를 볼 수 있습니다. 3.x 버전오면서 NDK_ROOT만 해주면 나머지 환경변수에 대한 이슈는 별로 없었는데 플러그인 작업을 진행하니 또 발생하네요.

Android NDK: D:\cocos2d-x-3.0alpha1\projects\AdMobTestGame\proj.android\..…

Cocos2d-x Plugin-X gameDevGuide.sh 실행 후 jar lib missing 이슈

이미지
Cocos2d-x 플러그인X의 게임 개발자 가이드 툴인 gameDevGuide.sh 를 실행하면 자동으로 안드로이드 프로젝트 설정과 관련 된 것을 변경해줍니다. 테스트로 flurry와 admob을 사용하게 설정 후 이클립스를 실행해보니 아래와 같이 jar 파일을 못 찾는 에러가 발생하네요.


DescriptionResourcePathLocationType
The project cannot be built until build path errors are resolvedAdMobTestGameUnknownJava Problem
Project 'AdMobTestGame' is missing required library: 'plugin-x/plugins/admob/android/libPluginAdmob.jar'AdMobTestGameBuild pathBuild Path Problem
Project 'AdMobTestGame' is missing required library: 'plugin-x/plugins/admob/android/GoogleAdMobAdsSdk.jar'AdMobTestGameBuild pathBuild Path Problem
Project 'AdMobTestGame' is missing required library: 'plugin-x/protocols/android/libPluginProtocol.jar'AdMobTestGameBuild pathBuild Path Problem
Project 'AdMobTestGame' is missing required library: 'plugin-x/plugins/flurry/android/libPluginFlurry.jar'AdMobTestGameBuild pathBuild Path Problem
Project 'AdMobTestGame' is missing required…

Cocos2d-x Plugin-X _tkinter.TclError: no display name and no $DISPLAY environment variable

이미지
Cocos2d-x 플러그인 시스템 중 게임 개발자 가이드 툴인 gameDevGuide.sh를 실행하니 아래와 같은 에러가 발생했습니다.

wwforever@AhnSangHak /cygdrive/d/cocos2d-x-3.0alpha1/plugin/tools
$ ./gameDevGuide.sh
/cygdrive/d/cocos2d-x-3.0alpha1/plugin/tools /cygdrive/d/cocos2d-x-3.0alpha1/plu
gin/tools
/cygdrive/d/cocos2d-x-3.0alpha1/plugin /cygdrive/d/cocos2d-x-3.0alpha1/plugin/to
ols /cygdrive/d/cocos2d-x-3.0alpha1/plugin/tools
/cygdrive/d/cocos2d-x-3.0alpha1/plugin/tools /cygdrive/d/cocos2d-x-3.0alpha1/plu
gin/tools
PLUGIN_ROOT = /cygdrive/d/cocos2d-x-3.0alpha1/plugin
TARGET_ROOT = /cygdrive/d/cocos2d-x-3.0alpha1/plugin/publish
flurry:umeng:alipay:nd91:admob:twitter:weibo:qh360:uc
Traceback (most recent call last):
  File "./toolsForGame/main.py", line 111, in <module>
    root = Tk()
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1745, in __init__
    self.tk = _tkinter.create(screenName, baseName, className, interactive, want
objects, useTk, sync, use)
_tkinter.TclError: no display name and no $DIS…

Cocos2d-x Plugin-X 빌드 후 파일 권한 문제

이미지
Cocos2d-x 플러그인-X publish 빌드 후 plugins와 protocols 폴더의 파일들이 생성은 되었으나 아래 그림과 같이 아무 내용이 없고 접근이 안되는 권한 문제가 발생할 수 있습니다.



 간단히 build_native.sh에 수정했던 것 처럼 아래 그림과 같이 plugin\tools\publish.sh파일에서 protocols과 plugins publish가 끝난 후 chmod 777 -R ${TARGET_ROOT} 를 추가해주면 publish 때 자동으로 파일 권한 문제가 해결됩니다.

Cocos2d-x Plugin-X error: format not a string literal and no format arguments

이미지
Cocos2d-x-3.0alpha1 플러그인 빌드중 protocols 부분에서 string 관련 컴파일 에러가 발생했습니다. NDK는  android-ndk-r9b 환경입니다.


Now publish protocols
---------------------------------
target dir is /cygdrive/d/cocos2d-x-3.0alpha1/plugin/publish/protocols
android project dir is /cygdrive/d/cocos2d-x-3.0alpha1/plugin/protocols/proj.and
roid

Publish plugin for android
/cygdrive/d/cocos2d-x-3.0alpha1/plugin/protocols/proj.android /cygdrive/d/cocos2
d-x-3.0alpha1/plugin/tools /cygdrive/d/cocos2d-x-3.0alpha1/plugin/tools
   [subant] No sub-builds to iterate on

BUILD SUCCESSFUL
Total time: 0 seconds
   [subant] No sub-builds to iterate on

BUILD SUCCESSFUL
Total time: 3 seconds
Build C++ code
/cygdrive/d/cocos2d-x-3.0alpha1/plugin/tools/toolsForPublish /cygdrive/d/cocos2d
-x-3.0alpha1/plugin/protocols/proj.android /cygdrive/d/cocos2d-x-3.0alpha1/plugi
n/tools /cygdrive/d/cocos2d-x-3.0alpha1/plugin/tools

/cygdrive/d/cocos2d-x-3.0alpha1/plugin/protocols/proj.android /cygdrive/d/cocos2
d-x-3.0alpha1/plugin/tools /cygdrive/…

Cocos2d-x Plugin-X publish Build Error

이미지
Cocos2d-x-3.0alpha1에 있는 플러그인 시스템을 빌드하는 중 아래와 같은 에러가 발생했습니다.

---------------------------------

Now publish umeng
---------------------------------
target dir is /cygdrive/d/cocos2d-x-3.0alpha1/plugin/publish/plugins/umeng
android project dir is /cygdrive/d/cocos2d-x-3.0alpha1/plugin/plugins/umeng/proj
.android

Publish plugin for android
/cygdrive/d/cocos2d-x-3.0alpha1/plugin/plugins/umeng/proj.android /cygdrive/d/co
cos2d-x-3.0alpha1/plugin/tools /cygdrive/d/cocos2d-x-3.0alpha1/plugin/tools

BUILD SUCCESSFUL
Total time: 0 seconds

BUILD FAILED
d:\android\adt-bundle-windows-x86_64-20131030\sdk\tools\ant\build.xml:542: Unable to resolve project target 'android-7'

Total time: 0 seconds
cp: cannot stat `/cygdrive/d/cocos2d-x-3.0alpha1/plugin/plugins/umeng/proj.andro
id/bin/*.jar': No such file or directory
/cygdrive/d/cocos2d-x-3.0alpha1/plugin/tools /cygdrive/d/cocos2d-x-3.0alpha1/plu
gin/tools
---------------------------------

Now publish alipay
---------------------------------
tar…

Unity3D 중국 로컬라이징시 이클립스 안드로이드 플러그인 연동시 주의사항

유니티3D 안드로이드 바이두 MobAds 광고 SDK 연동하는중 초기화가 되지않아 유니티3D에서 지원하는 Google Android Project 기능으로 바이두 광고 플러그인을 만들어 연동했었습니다.
 이 과정에서 제가 겪은 이슈는 아니고 다른분을 도와드리면서 나왔던 이슈가 있습니다. 기존 플러그인 방식 또는 순수 유니티3D 게임 빌드일 때는 없던 이슈 몇가지가 있어 정리해봅니다.
플러그인 연동 전에는 GUI.Label안에 중국어가 유니티3D 에디터에서 실행하거나 유니티에서 안드로이드 빌드 한 apk를 폰에서 실행시에는 잘 나오지만 플러그인으로 만들어 이클립스에서 빌드 후 테스트시에는 안나오는 이슈H2HDRM 폰트를 사용중에 발생했던 이슈로 중국에서 자주 사용하는 폰트로 바꿔 사용하면 해결된다.게임만 만들게 아니고 플러그인 작업이 들어간다면 꼭 중국이든 어디든 기본적으로 로컬라이징하는 국가의 폰트를 사용해주는게 좋다.유니티3D Build Setting에서 Product Name으로 중국어로 설정해 앱 런칭 아이콘 이름이 중국어로 잘 나왔으나 플러그인 작업시 익스포트하면 Product Name 그대로 중국어로 된 폴더로 익스포트되서 이클립스에서 임포트하지 못하는 문제기본적으로 프로그램밍 관련 폴더는 영어가 좋죠. Product Name은 영어로 해서 일단 이클립스 프로젝트를 만들어준다.2번에서 Product Name을 영어로 이클립스 프로젝트 생성 후 게임을 빌드하면 디바이스에 설치된 앱의 이름도 영어로 나온다. 기존처럼 중국어로 나오게 하려면?이클립스 프로젝트의 res/values/strings.xml 파일에 string name 부분을 수정한다. <meta-data android:name="BaiduMobAd_APP_ID" android:value="a1234567" /> <meta-data android:name="BaiduMobAd_APP_SEC" android:value="…

Cocos2d-x build_native.sh 시 Permission denied 자동으로 수정하기

이미지
블로그에 Cocos2d-x 이슈를 정리하는 동안 Permission denied 에러가 수 없이 발생했었습니다.



 특히 assets 폴더 이슈가 심했는데 발생시마다 chmod 777 -R /assets를 통해서 해결했지만 build_native.sh에 자동으로 빌드시마다 해결되게 아래와 같은 내용을 추가합니다.


# copy resources
for file in "$APP_ROOT"/Resources/*
do
if [ -d "$file" ]; then
    cp -rf "$file" "$APP_ANDROID_ROOT"/assets
fi

if [ -f "$file" ]; then
    cp "$file" "$APP_ANDROID_ROOT"/assets
fi
#Add - Permission denied auto fix
chmod 777 -R "$APP_ANDROID_ROOT" /assets
done

 위와 같이 copy resources 부분이 있는데 마지막 done 윗 부분에 chmod 내용을 추가합니다. 아니면 Cygwin을 관리자 권한으로 실행하거나 Windows7이라면 기본적으로 Administrator 계정 활성화를 통해서도 가능할 듯 합니다.

 정리하고 보니까 전에 정리했던 내용이네요 ㅎ; 그래도 전 내용은 Marker Felt.ttf 파일 때문에 에셋 팩킹을 실패하는 특화된? 빌드 이슈고 이건 보편적 내용이니까 일단 포스팅 남겨봅니다.

Cygwin Download Incomplete. Try again?

이미지
Cygwin을 오랜만에 다시 설치중 Download Incomplete. Try again? 에러가 아래와 같이 발생했습니다. 서버는 빨리 받기위해 다음에서 제공해주는 http://ftp.daum.net/cygwin 으로 했었는데요, 구글링을 해봐도 해결책은 없더군요. 그냥 다른 PC에서 설치 후 다운로드 된 원본 파일을 가져와 Install from Local Directory로 설치하라는 내용은 있더군요.



 일단 우연치 않게 설치가 마무리 되었는데 ftp.yz.yamagata-u.ac.jp 라는 일본 서버를 통해서 다시 시도하다가 같은 에러가 또 발생하는데 다시 다음으로 시도후 또 에러가 발생하면 그때는 N 를 눌러주면 잘 진행이 되더군요.



 다음 서버만 이런건지 아무튼 해결책이 좀 그렇긴 하지만 일단 설치 완료했습니다.

Android Bin, Gen 폴더가 생성이 안된다면

이미지
맥에서 오랜만에 Cocos2d-x 이클립스 프로젝트를 빌드 중 아래와 같이 gen과 bin 폴더 안에 아무것도 생성이 되지 않는 증상이 발생했습니다.



 안드로이드 SDK 메니저를 실행해보면 이상하게도 Android SDK Build-tools가 Not installed로 되어있네요. 일단 설치를 해줍니다.



 이제 빌드하면 되는데 제 경우 바로 빌드하면 안되고 이클립스를 재시작 후 Clean 빌드 해주니 잘 되더군요.

Xcode cannot run using the selected device.

이미지
Xcode cannot run using the selected device.

No provisioned iOS devices are available with a compatible iOS version. Connect an iOS device with a recent enough version of iOS to run your application or choose an iOS simulator as the destination.

 Cocos2d-x 구버전으로 만들어진 게임을 오랜만에 빌드 후 디바이스에 넣으려고 하니 위와 같은 오류가 발생했습니다.

 프로젝트 - General - Deployment Info - Deployment Target의 버전을 Build Settings에 있는 Base SDK 버전보다 낮게 설정하면 된다지만 이미 그리 세팅된 상태였습니다.

 다른 방법으로 Organizer에서 해당 디바이스를 선택 후 Restore using iTunes를 누르면 된다는데 저는 Use for Development을 누르니 되더군요.


 To add this device, select a Development Team to use for provisioning 팝업창에서 디바이스를 추가할 개발자를 선택하고 Choose를 누르면 됩니다. 디바이스 옆에 아이콘도 전엔 회색이더만 녹색으로 되네요.


 Scheme에서 iOS Device로만 보이던 것이 제대로 보이네요. 폰에도 잘 들어가구요.

Unity3D Baidu MobAds 배너광고 연동하기

이미지
유니티3D에 중국 바이두의 MobAds 광고 SDK 연동을 정리해보겠습니다. 배너광고와 동영상 광고등 몇가지 있는 듯 한데 그중에서 배너광고에 연동 정리이고 SDK 버전은 3.4입니다.

유니티3D에서 최종 빌드하는 플러그인 방식연동 실패했기 때문에 유니티3D 프로젝트를 Google Android Project 옵션으로 익스포트해서 플러그인 연동하는 방식으로 진행합니다.


1. 바이두 광고 플러그인 프로젝트 생성

 먼저 유니티3D 프로젝트를 Google Android Project로 익스포트 해주고 이클립스에서 Import 한 후 BaiduMobAdsPlugin 라는 jar lib 프로젝트를 만듭니다. BaiduMobAdsPlugin에 유니티3D classes.jar와 바이두 광고 SDK인 Baidu_MobAds_SDK.jar를 추가하면 아래와 같은 모습이 됩니다.



2. 바이두 광고 플러그인 안드로이드 소스

 안드로이드 플러그인 프로젝트인 BaiduMobAdsPlugin에 BaiduMobAds.java 클래스를 추가한 후 아래 소스 코드를 입력합니다.

package com.westwoodforever.unity3dplugin;

import org.json.JSONObject;

import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.view.ViewGroup;
import android.widget.RelativeLayout;

import com.baidu.mobads.AdView;
import com.baidu.mobads.AdViewListener;
import com.unity3d.player.UnityPlayer;

public class BaiduMobAds {
private static String LOG_TAG = "BaiduMobAds";

private final static in…

Unity3D Baidu MobAds 광고뷰가 보이지 않는다면

유니티3D 안드로이드에 중국 바이두의 광고 SDK인 Baidu MobAds를 연동 중 뷰가 보이지 않는 증상이 있었습니다. 플러그인 작업하면서 수많은 이슈를 겪어봐서 금방 처리될 줄 알았는데 의외로 시간 좀 걸렸네요. 일단 삽질기를 정리하고 따로 튜토리얼을 정리하겠습니다.

 기본적으로 이클립스에서 jar를 만들어 유니티3D에서 안드로이드 빌드하는 플러그인 방식으로 작업했었습니다. RelativeLayout으로 해봤다가 LinearLayout 해봤다가, AndroidManifest.xml도 다시 살펴보고 LayoutParams 이 잘 못 된 건가 등등 삽질을 했었죠. 답답해서 안드로이드 기본 EditText를 붙여보니 잘 나오더군요. 그래서 커스텀 뷰를 붙이는 코드는 이상이 없다는 결론을 내렸습니다.

 다음으로 SDK에 포함된 데모를 실행해보니 아래와 같은 로그가 나오더군요.

DexOpt: --- BEGIN '__pasys_remote_banner.jar' (bootstrap=0) ---
DexOpt: --- END '__pasys_remote_banner.jar' (success) ---
DEX prep '/data/data/com.baidu.mobads.demo.unzip in 12ms, rewrite 468ms
Baidu Mobads SDK Core Version:  3.68
您现在是debug模式,在测试完毕正式发布时,务必替换成正确的APPSID和计费名!
exp sn 2864 at http://mobads.baidu.com/ads/js/exp.js:1
exp e2: nth 13 [6500, 7000) at http://mobads.baidu.com/ads/js/exp.js:1
exp trunk 3.8.9 at http://mobads.baidu.com/ads/js/exp.js:1
onAdReady com.baidu.mobads.AdView@410e8b50
DexOpt: sleeping on flock(/data/data/…

Unity3D Prime31 처럼 자신만의 안드로이드 플러그인을 만들어보자

이미지
유명한 프라임31까지 언급하고 제목이 좀 거창하네요. 이미 유니티3D에서 최종 빌드하는 플러그인 작업과 이클립스에서 최종 빌드하는 플러그인 작업을 정리했었습니다. 2가지가 있는데 왠 플러그인 작업이 더 있겠는가 싶겠지만 유니티3D 4.x 부터 지원하기 시작하는 Google Android Project 기능을 가지고 정리를 해볼려고합니다.

 아래 내용을 보시면 아시겠지만 결과적으로는 이미 정리했던 2가지 방식을 적절히 혼합한 하이브리드 방식이라고 생각이 됩니다. 또한 수많은 플러그인 작업을 해오면서 여러 이슈를 해결해오다보니 개인적으로 지금 정리하는 3번째 플러그인 방식을 추천 드립니다.

 왜 추천드리는지 3번째 플러그인 방식의 장점과 단점을 나열해보자면,

장점setContentView, app_icon 등 초기 AndroidManifest.xml 수정 이슈가 없다.(서드파티 SDK를 붙인다면 수정할 수 있다)임시 이클립스 프로젝트인 Temp/StagingArea와 하위에 있는 assets/bin과 assets/libs를 복사할 필요가 없다.MainActivity와 의존성이 없다(사실 이건 기존 방식으로도 가능)중국 바이두 MobAds 광고 SDK는 이 방식으로 작업을 해야 했다.(2번째 방식도 가능)결과적으로 경험상 여러 플러그인 작업과 관련된 이슈가 더 적다.단점유니티3D에서 바로 빌드&실행이 안되고 iOS 빌드와 같이 한단계 거쳐 이클립스에서 빌드 한다.  사실 프라임31의 플러그인들이 어떻게 구성되어 있는지는 한번도 보지 않아서 모르겠습니다. 아마 이제 정리하는 방식 같지 않을까 추측해봅니다. 그럼 유니티3D 안드로이드 플러그인 최종판?에 대한 것을 정리해봤습니다.

1. 이클립스 안드로이드 프로젝트 익스포트

 먼저 유니티3D 프로젝트를 아래와 같이 만들었습니다.



 안드로이드 이클립스 프로젝트를 만들기 위해 Build Settings에서 Android - Google Android Project에 체크를 해주시고 Export 진행합니다.



 Produ…