5월, 2013의 게시물 표시

Unity3D Facebook SDK for Android Integration - 1. 준비작업

이미지
이번 포스팅은 유니티3D 네이티브 안드로이드에 페이스북 SDK 연동을 정리해봅니다. 원래는 Facebook SDK for .NET으로 연동할까 했는데 추후에 시간이 있을 때 다시 해볼까 합니다. 포스팅 많이하기 시작했던 cocos2d-x 때와는 다르게 하나에 쭉 다 포스팅이 아닌 먼저 포스팅했던 내용들은 그 링크들로 대신합니다.
페이스북 개발자 및 앱 등록유니티3D 안드로이드 JAR 플러그인 프로젝트 생성페이스북 SDK 설치 및 빌드연동에 필요한 관련 파일 복사 및 AndroidManifest.xml 수정테스트를 위한 페이스북 해시키 생성 및 등록  위와 같은 내용들을 준비과정으로 정리했습니다.


1. 페이스북 개발자 등록

 먼저 페이스북 개발자 등록을 합니다.


2. 페이스북 앱 등록

 만들어 서비스할 앱을 페이스북에 등록합니다.


3. 유니티3D 프로젝트 및 안드로이드 페이스북 Jar 플러그인 만들기

유니티3D에서 안드로이드용 외부 SDK 연동을 위해서는 플러그인 JAR 파일을 만들어야하죠. 링크에 있는 내용을 보시고 폴더 설정등 기본 준비작업을 하시면 됩니다. 저는 스샷과 같이 UnityAndroidFacebookJar라고 만들었습니다.


4. 페이스북 안드로이드 SDK 설치 및 임포트

페이스북 개발자 페이지의 안드로이드 SDK를 다운로드합니다. v3.0.1이 현재 최신입니다.

 적당한 곳에 다운로드 받은 페이스북 안드로이드 SDK를 압축해제합니다. 제 프로젝트 구성은 위와 같습니다. UnityFacebook은 유니티3D 프로젝트고 AndroidJar에는 위에서 생성한 이클립스 프로젝트가 들어있습니다.

 이클립스에서 페이스북 SDK를 임포트합니다. facebook-android-sdk-3.0.1\facebook 에 들어있습니다. 그러면 스샷과 같이 느낌표가 있고 에러가 발생할 듯합니다.

Project 'FacebookSDK' is missing required source folder: 'gen'
The project cannot be bu…

Unity3D facebook java.lang.NoClassDefFoundError: com.facebook.android.R$layout

이미지
아래 내용은 임시 해결 내용으로 제대로 된 해결은 링크를 확인하시면 됩니다.

 이번 포스팅은 유니티3D 페이스북 안드로이드 연동 튜토리얼 포스팅을 올리기전 마지막 이슈 포스팅이 될 듯합니다.

D/AndroidRuntime(13471): Shutting down VM
W/dalvikvm(13471): threadid=1: thread exiting with uncaught exception (group=0x4001e578)
FATAL EXCEPTION: main
java.lang.Error: FATAL EXCEPTION [main]
Unity version     : 4.1.2f1
Device model      : samsung SHW-M250K
Device fingerprint: samsung/SHW-M250K/SHW-M250K:2.3.6/GINGERBREAD/FB22:user/release-keys
Caused by: java.lang.NoClassDefFoundError: com.facebook.android.R$layout
at com.facebook.LoginActivity.onCreate(LoginActivity.java:55)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)
at android.app.ActivityThread.access$1500(ActivityThread.java:117)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
at android.os.Handler.dispatchMessag…

Unity3D facebook android.content.res.Resources$NotFoundException: Resource ID #0x7f030001

이미지
Shutting down VM
threadid=1: thread exiting with uncaught exception (group=0x40a461f8)
FATAL EXCEPTION: main
java.lang.Error: FATAL EXCEPTION [main]
Unity version     : 4.1.2f1
Device model      : Acer A500
Caused by: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.Test.unityandroidfacebookjar/com.facebook.LoginActivity}: android.content.res.Resources$NotFoundException: Resource ID #0x7f030001
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
at android.app.ActivityThread.access$600(ActivityThread.java:123)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4424)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.inter…

Windows 64bit에서 32bit 응용프로그램의 가상 주소 공간을 2GB 이상 처리 가능하게 빌드하기

이미지
게임이나 응용 프로그램이 실행중에 메모리가 막 올라가다가 메모리부족으로 런타임에 죽는 현상이 발생할 수 있습니다. 윈도우 32비트에서 최대 사용 가능한 메모리는 2기가죠. 64비트 윈도우에서 32비트로 빌드된 프로그램은 최대 4기가까지 사용가능합니다.

 하지만 바로 적용되는건 아니고 링크 옵션에 설정해줘야합니다. 프로젝트 속성 -> 링커 -> 시스템 -> 큰 주소 사용에서 2GB 이상인 주소 지원(/LARGEADDRESSAWARE)를 활성화 시킵니다.

 이 옵션은 64bit 빌드에는 기본 활성화가 되어있고 32bit를 빌드시 필요할 때 활성화해주면 됩니다.

Java 커맨드 명렁어로 직접 java 컴파일 후 jar 파일로 묶기

이미지
유니티3D 안드로이드 페이스북 연동중 페이스북 SDK의 R.java를 수정 후 직접 컴파일해서 jar 파일로 만들어야할 상황이 생겨서 정리를 해봅니다.

  javac R.java -d .

 R.java대신 원하시는 자바 파일을 기입하시고 위와 같이 컴파일 합니다. . 은 현 디렉터리입니다. 그러면 위 스샷과 같이 패키지 구조대로 디렉터리가 생성되면서 java파일이 class로 컴파일 됩니다.

 jar cvfM facebookR.jar com/

 위와 같이 입력하면 com/ 이하 디렉터리를 facebookR.jar로 만듭니다. 자세한 옵션은 jar만 자세히 한글로 나오네요.

Unity3D Android Jar Plugin 연동시 FATAL EXCEPTION GLThread

우려했던 일이 현실이 되었네요. 처음 유니티3D 안드로이드 Jar 플러그인 만들어 연동하는 것을 정리했을 때 cocos2d-x jni로 GLThread쪽 이슈 처리에 대한 것을 언급했었습니다. 당시 포스팅은 간단한거라 이슈가 없었고, 지금은 페이스북 연동중인데 일부러 runOnUiThread를 빼고 해줬더니 역시나 문제가 발생하네요.

Exception Ljava/lang/RuntimeException; thrown while initializing Landroid/os/AsyncTask;
threadid=10: thread exiting with uncaught exception (group=0x40a461f8)
FATAL EXCEPTION: GLThread 4143
java.lang.Error: FATAL EXCEPTION [GLThread 4143]
Unity version     : 4.1.2f1
Device model      : Acer A500
Caused by: java.lang.ExceptionInInitializerError
at com.Test.unityandroidfacebookjar.MainActivity.PostToMeWall_U(MainActivity.java:152)
at com.unity3d.player.UnityPlayer.nativeRender(Native Method)
at com.unity3d.player.UnityPlayer.onDrawFrame(Unknown Source)
at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1462)
at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1216)
Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.p…

facebook 안드로이드 연동에 필요한 해시키 생성하기

이미지
유니티3D 안드로이드에 페이스북을 연동중에 있습니다. 꼭 유니티3D가 아니더라도 페이스북을 연동하는 네이티브 안드로이드 앱이라면 해시키를 추출해서 페이스북 개발자 페이지에 설정해줘야합니다. 이번 포스팅은 안드로이드 해시키 추출하는 것을 정리해봅니다.

 필요한 준비물은 3개입니다. 일단 키 및 인증서 관리 툴인 keytool.exe와 OpenSSL이 그것이죠. keytool은 자바를 설치하면 있으므로 넘어가고 OpenSSL은 윈도우용 바이너리 설치 정리를 해놨으니 링크를 참고하세요.

 마지막으로 .android안에 있는 debug.keystore 파일입니다. 이건 각자 위치가 다르니 위치를 알고 계셔야합니다. 보통 C:\Users 안에 계정명 디렉터리에 있습니다.

keytool -exportcert -alias androiddebugkey -keystore c:\Users\wwforever.NOWCOM\.android\debug.keystore | openssl sha1 -binary | openssl base64

 cmd 콘솔에서 붉은색 부분은 각자의 환경에 맞게 기입후 입력해줍니다. 키 저장소 비밀번호 입력은 android를 입력해주면 해시키가 출력됩니다. 저 키를 페이스북 개발자 페이지의 앱 설정에 기입하면 됩니다.

 만들어진 KeyHash값은 사용하는 디바이스나 안드로이드 프로젝트와는 무관합니다. 즉, 프로젝트가 바뀐다고해도 해시키는 같습니다. 생성하는 컴퓨터와 관련이 있는 것이죠.

OpenSSL 윈도우 바이너리 버전 설치

이미지
이젠 OpenSSL까지 설치를 하게되네요. 전자상거래등의 보안을 위해 개발된 SSL, TLS 프로토콜의 오픈소스 버전이라고합니다. 현재 버전 1.0.1e가 최신인데 해당 버전의 소스버전말고 바이너리 설치버전에 대한 것을 정리해봅니다.

1. OpenSSL 윈도우용 다운로드

 사실 OpenSSL 공식 홈페이지에 가봐도 다운로드 링크는 보이지 않습니다. 공식 페이지에서는 소스버전만 배포하고 있습니다.

Related의 Binaries 탭에 가보면 OpenSSL for Windows 링크가 하나 있습니다. 링크를 클릭해 이동합니다.

 해당 사이트에서는 OpenSSL을 미리 윈도우용으로 컴파일한 바이너리 설치본을 배포하고 있습니다. Win32용과 Win64용이 있으니 OS에 맞는 버전으로 다운로드하시면 됩니다. 그리고 개발자용 풀버전과 일반 사용자용 Light 버전이 있습니다. 저는 Win64 OpenSSL v1.0.1e Light로 다운받아 진행합니다.


2. OpenSSL 설치

 다운받은 파일을 실행합니다. 그러면 위와 같은 창이 뜨는데 이건 Visual C++ 2008 Redistributables가 설치되지 않아서입니다. 위 사이트에서 다운로드해서 설치하시면 됩니다. '확인'을 눌러 무시하고 진행 설치해도 됩니다.

 OpenSSL 설치 위자드가 실행되었습니다. 'Next'를 클릭합니다.

 라이센스 동의를 체크 후 'Next'를 클릭합니다.

 설치경로를 지정합니다. 'Next'를 클릭합니다.

 시작 메뉴 폴더 지정입니다. 'Next'를 클릭합니다.

 OpenSSL 관련된 추가 파일의 설치 위치를 지정합니다. 'Next'를 클릭합니다.

 설치 준비가 되었습니다. 'Install'를 클릭합니다.

 설치중입니다.

 설치가 완료되었습니다. 기부하라는 창인데 하실분들은 하시면 되겠네요.


3. 시스템 환경 변수 설정

 제어판 -> 시스템 및 보안 -> 시스템 -> 고…

Eclipse Android Logcat에 로그가 보이지 않는다면

이미지
이클립스로 안드로이드 작업하다보면 위 스샷과 같이 로그캣에 로그가 전혀 안 찍힐 때가 있습니다. 예전에도 몇번을 그러길래 이클립스를 다시 실행해주거나 하는식으로 해결을 했었는데 다른 방법이 있네요.

 Device창에서 연결된 디바이스를 클릭하면 됩니다. 디바이스 창이 보이지 않는다면 Windows -> Show View -> Other에서

 Devices를 선택합니다.

 Devices에서 연결된 디바이스를 클릭하면,

 이클립스를 다시 실행안해줘도 다시 잘 나옵니다.

facebook curl로 담벼락 게시해보기

이미지
유니티3D에 페이스북 연동을 하기전에 command line tool인 curl을 가지고 간단히 페이스북 담벼락에 게시 테스트 해본것을 정리해봅니다.
1. 페이스북 개발자 등록 및 앱 등록
 먼저 페이스북에 개발자 등록을 하신 후 페이스북에 앱을 등록합니다.

2. 인증과 토큰 생성
https://www.facebook.com/dialog/oauth?client_id=442544649174747&client_secret=349717fd850b6587b66543ff0b190c8c&display=popup&response_type=code token&redirect_uri=http://www.facebook.com/connect/login_success.html&scope=publish_stream
 위 client_id와 client_secret는 제가 등록한 페이스북 테스트 앱의 것입니다. 브라우저 주소창에 각자가 등록한 앱의 정보에 해당하는 내용을 입력후 이동합니다. 자세한 api 사용법은 페이스북 개발자 페이지의 The Login Flow for Web (without JavaScript SDK)를 참고하세요.
 권한 설정으로 scope=publish_stream 을 해줘야 담벼락 게시를 할 수 있습니다. 역시나 자세한 것은 permissions 문서를 참고하세요.
  페이스북에 로그인 된 상태가 아니라면 위와 같이 페이스북 로그인 화면이 나옵니다. 로그인을 합니다.

 로그인한 상태였다면 위와같이 앱이 페이스북에 접근하는 것에 대한 허락하라는 창이 뜹니다. '확인'을 클릭해줍니다.

 인증에 성공하면 토큰 정보가 넘어옵니다. 주소에 access_token등의 정보가 있는데 만약, http://www.facebook.com/connect/blank.html#_=_ 나올 수 있습니다. 제 경우는 구글 크롬에서는 이렇더군요. 익스플로러에서 진행해보시기 바랍니다.

http://www.facebook.com/conne…

Android java.lang.IllegalArgumentException: already added:

이미지
안드로이드 작업중 제목과 같은 에러가 발생할 수 있습니다. 저는 유니티3D 안드로이드에 페이스북 연동중에 빌드시 DEX부분에서 실패를 하네요.

UNEXPECTED TOP-LEVEL EXCEPTION:
java.lang.IllegalArgumentException: already added: Lcom/facebook/android/R$attr;
at com.android.dx.dex.file.ClassDefsSection.add(ClassDefsSection.java:123)
at com.android.dx.dex.file.DexFile.add(DexFile.java:163)
at com.android.dx.command.dexer.Main.processClass(Main.java:490)
at com.android.dx.command.dexer.Main.processFileBytes(Main.java:459)
at com.android.dx.command.dexer.Main.access$400(Main.java:67)
at com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:398)
at com.android.dx.cf.direct.ClassPathOpener.processArchive(ClassPathOpener.java:245)
at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:131)
at com.android.dx.cf.direct.ClassPathOpener.processDirectory(ClassPathOpener.java:191)
at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:123)
at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:109)
at com…

Unity3D facebook java.lang.NoClassDefFoundError: android.support.v4.content.LocalBroadcastManager

이미지
D/AndroidRuntime(12671): Shutting down VM
W/dalvikvm(12671): threadid=1: thread exiting with uncaught exception (group=0x4001e578)
FATAL EXCEPTION: main
java.lang.Error: FATAL EXCEPTION [main]
Unity version     : 4.1.2f1
Device model      : samsung SHW-M250K
Device fingerprint: samsung/SHW-M250K/SHW-M250K:2.3.6/GINGERBREAD/FB22:user/release-keys
Caused by: java.lang.NoClassDefFoundError: android.support.v4.content.LocalBroadcastManager
at com.facebook.Session.postActiveSessionAction(Session.java:1215)
at com.facebook.Session.setActiveSession(Session.java:765)
at com.facebook.Session.openActiveSession(Session.java:865)
at com.facebook.Session.openActiveSession(Session.java:805)
at com.Test.unityandroidfacebookjar.MainActivity.onCreate(MainActivity.java:31)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)

facebook Error. Jar mismatch! Fix your dependencies.

이미지
페이스북 SDK 임포트시 나오는 에러를 해결했더니 이번에는 바로 jar mismatch 라는 에러가 발생하네요.
[2013-05-27 11:13:19 - UnityAndroidFacebookJar] Found 2 versions of android-support-v4.jar in the dependency list,
[2013-05-27 11:13:19 - UnityAndroidFacebookJar] but not all the versions are identical (check is based on SHA-1 only at this time).
[2013-05-27 11:13:19 - UnityAndroidFacebookJar] All versions of the libraries must be the same at this time.
[2013-05-27 11:13:19 - UnityAndroidFacebookJar] Versions found are:
[2013-05-27 11:13:19 - UnityAndroidFacebookJar] Path: D:\ProgramSource\facebookTest\AndroidJar\libs\android-support-v4.jar
[2013-05-27 11:13:19 - UnityAndroidFacebookJar] Length: 393154
[2013-05-27 11:13:19 - UnityAndroidFacebookJar] SHA-1: 307c1cc532eabbf1d135b43e5c983c9da700449d
[2013-05-27 11:13:19 - UnityAndroidFacebookJar] Path: D:\ProgramSource\facebookTest\facebook-android-sdk-3.0.1\facebook\libs\android-support-v4.jar
[2013-05-27 11:13:19 - UnityAndroidFacebookJar] Length: 349252
[2013-05-27 11:13:1…

facebook Android SDK Import시 오류 해결

이미지
유니티3D 안드로이드 프로젝트에 페이스북 안드로이드 SDK를 연동중에 있습니다. 이클립스에 단순히 페이스북 안드로이드 SDK 임포트만 해줘도 에러가 발생하네요. 뭐 cocos2d-x때 하도 당해서 이제 놀랍지도 않네요.


Project 'FacebookSDK' is missing required source folder: 'gen'
The project cannot be built until build path errors are resolved
Unable to resolve target 'android-8'

 위와같은 에러가 발생합니다. 예전에 gen 폴더 관련 에러는 링크처럼 해결했는데 이번에는 해결이 안되더군요.


 먼저 Unable to resolve target 'android-8' 해결을 위해 페이스북 SDK의 Properties -> Android에서 Project Build Target이 위와같이 체크 해제되어 있을텐데 이것을 체크하신 후 저장합니다. 이제 Clean후 Build해보면,

Unable to resolve target 'android-8'
Project 'FacebookSDK' is missing required source folder: 'gen'
The project cannot be built until build path errors are resolved

 3가지가 모두 해결됩니다. 그런데,
Android requires compiler compliance level 5.0 or 6.0. Found '1.7' instead. Please use Android Tools > Fix Project Properties.

 에러가 발생하네요. 이것 역시 예전에 cocos2d-x로 작업중 외부 SDK들 연동할 때 처리해놨던 에러입니다. 링크를 확인하세요.

Eclipse Workspace Unavailable

이미지
유니티3D 했다가 이클립스 안드로이드 했다가 왔다갔다 했더니 정신이없네요. 별로 맘에 안드는 이클립스가 워크스페이스 에러를 뿜더군요.

 이클립스가 이미 실행중이라서 발생했던 에러였습니다. 물론 다른 경우도 있다고 합니다. 이클립스 종류 후 다시 실행해도 같은 에러라면 프로세스가 실행중이라 그런것이니 강제 종료 후 실행하면 된다네요.