728x90

이번 포스팅은 저희가 필요로 하는 클래스나, 함수등을 직접 라이브러리로 만들어서 적용시켜보겠습니다.

(2)번 포스팅에 이어서 프로젝트는 동일합니다.

 

/////////////// 사용자 정의 라이브러리 생성 및 사용법 ///////////////

 

 

1. CreateLib 솔루션 오른쪽 클릭 -> 새프로젝트 추가 -> Win32 콘솔 응용 프로그램을 만듭니다.

프로젝트 이름은 Userlib 로 만들겠습니다.

 

설정은 DLL, 내보내기 기호 체크 해주세요.

 

 

Userlib 프로젝트에서 클래스를 추가 해줍니다. 클래스는 CCalc 라는 명의 클래스를 만들도록 하겠습니다.

 

 

2. 함수를 하나 만드는데 함수는 간단 두개의 int형 매개변수를 받아서 그 차의 값을 리턴해주는 함수를 생성하겠습니다.

 

 

3. view에서 Userlib 프로젝트의 CCalc.h 헤더 파일을 include 해주고 생성자에서

CCalc 클래스에있는 sub 함수를 호출하고 있지만 참조할수 없다는 링크에러가 나옵니다.

 

 

4. 동적,정적 라이브러리를 할때와 마찬가지로 CreatLib 프로젝트 속성으로 들어가신후 공용 속성에서 새 참조 추가를 Userlib 프로젝트로 설정해 줍니다.

 

 

 

 Userlib.h 헤더 파일로 가보면

#ifdef USERLIB_EXPORTS
#define USERLIB_API __declspec(dllexport)
#else
#define USERLIB_API __declspec(dllimport)
#endif

 

이러한 코드가 있습니다. 이 코드를 복사 한후 밑의 사진처럼 CCalc.h 헤더 파일에 붙여 주시고

 

클래스 이름 앞에 USERLIB_API를 붙여 줍니다.

(win32 콘솔 에서는 이 코드가 바로 외부에서 사용 가능하게 만들어주는 기능을 한다고 합니다.)

그럼 링크 에러가 사라집니다.

 

 

5.  똑같이 Debug 폴더에 Userlib.lib와, User.dll 이라는 우리가 만든 프로젝트 이름의 라이브러리가 생성 됩니다.

 

 

 

늘 그랬듯이. CreateLib 폴더 안에 Userlib.lib를 붙여 넣어 주시고

 

 

비쥬얼 스튜디오로 돌아와서 CreateLib 프로젝트 오른쪽 클릭 -> 속성 -> 링커 -> 입력 에서

추가종속성 편집을 실행하신후 추가한 Userlib.lib 이름을 적어주시고 적용시켜 주시면

4번에서 새참조 추가를 했던 Userlib 프로젝트를 지우고 컴파일 해보셔도 이제 잘 되는 것을 확인할수 있습니다.

 

 

여기까지 사용자가 직접 정의해서 라이브러리를 생성 하고 적용 시키는 방법 이였습니다.

 

(다른 여러 방법이 더 있겠지만 저도 아직 잘 모르는 부분이 많다는점... )

728x90
Posted by 정망스
,
728x90

이번 포스팅은 동적 라이브러리를 생성하고 적용시켜보겠습니다.

(1)번 포스팅에 이어서 프로젝트는 동일합니다.

 

/////////////// 2. 동적 라이브러리 생성 및 사용법 ///////////////

 

1. CreateLib 솔루션 오른쪽 클릭 -> 새프로젝트 추가 -> MFC DLL 만듭니다.

프로젝트 이름은 mfcdll 로 만들겠습니다.

 

설정은 MFC 확장 DLL에 체크 해주세요.

 

 

2. 테스트를 위해서 리소스 뷰에서 mfcdll 프로젝트에 다이얼로그를 하나 생성 하겠습니다.

ID 값은 IDD_TEST_DLL로 설정했습니다.

 

 

다이얼로그를 더블클릭 하시면 클래스 추가 마법사 창이 뜹니다.

이름은 CTestDialog 로 하고 클래스를 하나 생성하겠습니다.

 

추가 하신후 IDD_TEST_DLL 이 정의되지 않았습니다. 와 같은 오류가 뜨면

resource.h 헤더를 include 해주시면 해결 됩니다.

 

 

3. view 화면으로 돌아와서 mfcdll 프로젝트에 있는 TestDialog.h 헤더 파일을 include 해주고

생성자 에서 앞서 만들엇던 다이얼로그 창을 띄우는 코드를 넣고 컴파일 해보면

정적 라이브러리 생성때와 같이 링크 에러가 발생합니다.

 

 

4. 정적 라이브러리 때와 마찬가지로 CreatLib 프로젝트 속성으로 들어가신후 공용 속성에서 새 참조 추가를 mfcdll 프로젝트로 설정해 줍니다.

 

 

 

그리고 TestDialog.h 헤더 파일에서 class 이름 앞에 AFX_EXT_CLASS 라는 키워드를 붙여줍니다.

이 키워드는 외부에서도 이 클래스에 접근 가능하게하여 사용할수 있게 해준다는 키워드입니다.

(mfc일경우에 한해서 사용하는 키워드)

 

다 하셨으면 이제 문제없이 컴파일이 잘 되는것을 확인 하실수 있습니다.

 

 

5. 정적때와 마찬가지로 여기까지 잘 따라하시면서 컴파일 하셧다면 프로젝트 명과 동일한 mfcdll.dll 와 mfcdll.lib 2개가 생성된것을 보실수 있습니다.

 

동적 라이브러리 같은 경우에는 dll와, lib 2개가 생성됩니다.

 

 

6. CreateLib 폴더에 mfcdll.dll와, mfcdll.lib 라이브러리를 추가해 줍니다.

 

 

비쥬얼 스튜디오로 돌아와서 CreateLib 프로젝트 오른쪽 클릭 -> 속성 -> 링커 -> 입력 에서

추가종속성 편집을 실행하신후 추가한 mfcdll.lib 이름을 적어주시고 적용시켜 주시면

새참조 추가를 했던 mfcdll 프로젝트를 지우고 컴파일 해보셔도 이제 잘 되는 것을 확인할수 있습니다.

 

 

추가는 lib만 하는데 dll은 왜 같이 넣는지 처음에 제가 궁금했었고 보시는분들도 궁금하실수 있는데

dll은 추가하는것이 아니고 dll을 같이 넣지 않으면 원래 이 라이브러리는 dll을 기준으로 만들어 졌기 때문에

컴파일이나, 빌드 하는데 있어선 문제가 없지만 프로그램 실행을 하는데 있어서 dll이 같이 없다면 해당하는 dll이 없어서 실행을 못한다 라는 오류가 뜨게 된다고 합니다.

 

아무튼 여기까지 동적 라이브러리 생성 하고 적용하여서 실행하면 우리가 만든 다이얼로그가 뜨는것을 알수 있습니다. 라이브러리가 재대로 추가되서 사용 되고 있다는 뜻입니다!

 

다음엔 우리가 직접 만들거나, 혹은 필요한 클래스나 함수등등을 라이브러로 만들어서 사용하는 방법을 포스팅 해보겠습니다.

728x90
Posted by 정망스
,
728x90

우선 라이브러리들을 생성한후 적용해서 테스트를 할 기본적인 프로젝트를 생성합니다.

 

저는 MFC 로 프로젝트를 생성합니다.

특별한 옵션은 없고, 그냥 응용프로그램 종류에서 단일 문서에만 체크를 해놓고 생성하겠습니다.

프로젝트 명은 CreateLib 라고 했습니다.

 

/////////////// 1. 정적 라이브러리 생성 및 사용법 ///////////////

 

 

Json을 사용하기 위해  jsoncpp를 정적 라이브러리로 만들어 보겠습니다.

 

저는 jsoncpp-src-0.5.0 를 다운받아서 사용합니다.

jsoncpp는 인터넷에서 쉽게 찾아서 다운로드 하실수 있습니다 ~

 

 

1. 사진에 보이듯이 솔루션 오른쪽 클릭 -> 추가 -> 새프로젝트를 누른후 -> win32(win32 프로젝트) 만듭니다.(프로젝트 명: JSon)

 

 

2. 설정은 정적 라이브러리에 체크, 미리 컴파일된 헤더는 해제해주세요.

 

 

 3. 생성완료 하셧으면 아까만든 프로젝트(CreateLib) 폴더안에 JSon이라는 이름의 프로젝트 폴더가 하나 더 생긴것을 확인할수 있습니다.

 

JSon 폴더 안에 lib_json 이라는 폴더를 사진에서 보시는것처럼 붙여놓았는데

 

lib_json 안에 들어가는 목록들은 우선 jsoncpp-src-0.5.0(버전) 을 다운로드 하셧다면

jsoncpp-src-0.5.0 -> src 에 들어가시면 lib_json 폴더가 있는데 우선 그폴더를 복사해서 붙여넣어주시고

jsoncpp-src-0.5.0 -> include에 들어가시면 json 폴더가 있는데 그 폴더를 lib_json에 같이 넣으셔서 사진처럼 넣어줍니다.

 

 

4. 3번까지 완료하셧으면 이제 비쥬얼 스튜디오로 다시 돌아와서 JSon이라는 필터 하나 만들어주시고 거기 안에는 lib_json->json 폴더 안에 있는 헤더파일들을

 

소스 파일에는 lib_json 폴더 안에 있는 json_reader, json_value, json_writer.cpp 를 불러와 줍니다.

(사진은 저렇게 분류해서 불러왓지만 저렇게 분류해서 굳이 불러오지 않아도 됩니다.)

 

 

5. 이제 json.h파일을 include 시키고 우선 생성자 안에 StyledWriter를 하나 만들었습니다. 그 후

빌드를 하면 저렇게 링크 에러가 발생합니다.

링크 에러가 발생하는 이유는 참조를 시켜주지 않아서 컴파일된 함수같은것들을 가져오지 못하기 때문입니다.

 

6. CreateLib 프로젝트 -> 오른쪽 클릭 -> 속성 -> 공용 속성-> 새 참조 추가 까지 실행하신후에

앞서 만들엇던 JSon 프로젝트를 참조로 추가를 해주고 적용시킵니다.

그러면 앞서 발생했던 링크에러가 해결되는 현상을 볼수 있습니다. (JSon을 사용할수 있게 됫죠!)

 

 

7. 여기까지 잘 따라 하셧다면 컴파일 2~3번은 하셨을텐데요.

그러다보면 CreateLib 프로젝트 폴더 -> Debug 폴더 에 들어가보시면 아까 우리가 만들었던 JSon 프로젝트 이름과 똑같은 lib의 확장자 명을 가진 라이브러리가 보일 겁니다.

이 라이브러리가 바로 저희가 컴파일 하는 순간 만들어진 그리고 저희가 얻고자 햇던 json과 관련된 정적 라이브러리 입니다.

이 라이브러리를 이제 프로젝트에 추가만 해주면 앞서 6번에서 햇던 새 참조 추가 이런일을 하지 않아도 json을 그냥 사용할수 있게 됩니다.

 

 

 

 

 

8. 기존 처음 프로젝트엿던 CreateLib 폴더에 7번에서 만들어졋던 JSon.lib 를 복사해서 붙여 넣습니다.

 

 

비쥬얼 스튜디오로 돌아와서 CreateLib 프로젝트 오른쪽 클릭 -> 속성 -> 링커 -> 입력 에서

추가종속성 편집을 실행하신후 추가한 JSon.lib 이름을 적어주시고 적용시켜 주시면

6번에서 하셧던 새참조 추가를 지우고 컴파일 해보셔도 이제 잘 되는 것을 확인할수 있습니다.

 

 

즉. 정적 라이브러리를 생성하고, 적용까지 완료 하셨단 이야기구요. 이제 이 json 라이브러리를 사용하기만 하면 되는겁니다!

 

다음엔 동적 라이브러리 생성 및 적용 포스팅을 해보겠습니다.

 

728x90
Posted by 정망스
,

라이브러리(Library) 란?

C++ 2014. 8. 22. 14:23
728x90

라이브러리 정의부터 일단 정리해보겠습니다.

 

라이브러리를 사용하는 이유는

 

외부에 소스를 유출하지 않고 자신이 만든 모듈을 공유하기 위해서라고 합니다.

그리고 라이브러리 자체가 이미 컴파일이 되어있는 것이라서 컴파일 시간도 단축된다고 합니다.

 

라이브러리의 종류에는 동적 라이브러리와, 정적 라이브러리가 있습니다.

특징별로 어느것을 사용할 것인지를 결정하면 됩니다.

 

1. 동적 라이브러리 ( Dynamic Link Library (dll))

 

- 프로그램 실행 시 필요시만 외부 dll 파일에서 함수를 참조

- 프로그램 실행 시 프로그램 로딩 시간이 단축

- 함수 업그레이드 시 해당 dll만 수정 배포한다.

- 소스 외부 유출 방지 효과

- 실행 파일 만들때 필요한 파일: *.h, *.lib, (*.dll 참조 용)

- 프로그램 실행할 때 필요한 파일: *.dll(배포할 때 *.dll 필요)

- dll 제작시 lib도 같이 생성됨

 

2. 정적 라이브러리 (Static Link Library (lib))

 

- 필요한 함수를 프로그램 코드에 붙여 프로그램 자체에서 참조

- 프로그램 실행 후 빠른 처리시간

- 프로그램 실행 후 빠른 처리시간 프로그램 실행 파일만 있으면 실행(하나의 파일만 있으면 됨)

- 소스 외부 유출 방지 효과

- 실행 파일 만들때 필요한 파일: *.h *.lib(별도의 *.dll 필요 없음)

728x90
Posted by 정망스
,
728x90

확실하지 않은 부분, 혹은 틀린 부분이 있을수도 잇다는 점을 우선 말씀드리고

포스팅 하겠습니다. (제 폰에는 정상적으로 다 잘됬음..)

 

우선 구글 AdMob을 이용하기 위해선 가입을 하셔야됩니다.

(http://www.google.co.kr/ads/admob/)

 

 

가입을 다 완료 하시게 되면

 

 

아래와같은 화면으로 이동할수 잇게 되고

저기 빨간박스로 줄치어진 부분에서 게시자 ID pub-xxxxxxxxxxxx.... 뭐로 시작하는게 있는데 나중에 이부분이 광고를 달때 쓰이니까 일단 기억해 두시길 바랍니다.

 

여기까지 이제 애드몹을 쓰기위한 준비는 끝...

 

1 . 이제 간단한 테스트를 위한 cocos2d-x 코드를 설명하겠습니다.

 

///// HelloWorldScene.h /////

 

#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__

#include "cocos2d.h"

class HelloWorld : public cocos2d::LayerColor
{
public:
 static cocos2d::Scene* createScene();

 virtual bool init();


 

 void doShow(Ref* pSender); //광고를 보여준다
 void doHide(Ref* pSender); //광고를 숨긴다
    
 CREATE_FUNC(HelloWorld);
};

#endif // __HELLOWORLD_SCENE_H__

 

///// HelloWorldScene.cpp /////

 

#include "HelloWorldScene.h"


 

USING_NS_CC;

 

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#include "platform/android/jni/JniHelper.h"

void callJavaMethod(std::string func)
{
    JniMethodInfo t;
    /**
     JniHelper를 통해 org/cocos2dx/cpp/에 있는
     AppActivity class의 파라미터로 들어온 스트링 이름의 함수 정보를 가져온다.
     */
    if (JniHelper::getStaticMethodInfo(t
                                       , "org/cocos2dx/cpp/AppActivity"
                                       , func.c_str()
                                       , "()V"))
    {
        // 함수 호출
        t.env->CallStaticVoidMethod(t.classID, t.methodID);
        // Release
        t.env->DeleteLocalRef(t.classID);
    }
}

#endif

 

Scene* HelloWorld::createScene()
{
    auto scene = Scene::create();
    auto layer = HelloWorld::create();
    scene->addChild(layer);
    return scene;
}

 

bool HelloWorld::init()
{
 if (!LayerColor::initWithColor(Color4B(255, 255, 255, 255)))
    {
        return false;
    }
    
 Size visibleSize = Director::getInstance()->getVisibleSize();
 Point origin = Director::getInstance()->getVisibleOrigin();

 

 MenuItemFont::setFontName("fonts/Marker Felt.ttf");
 MenuItemFont::setFontSize(40);


 

 auto pMenuItem1 = MenuItemFont::create("View", CC_CALLBACK_1(HelloWorld::doShow, this)); //View 글자를 누르면 doShow 함수를 호출
 pMenuItem1->setColor(Color3B(0, 0, 0));

 

 auto pMenuItem2 = MenuItemFont::create("Hide", CC_CALLBACK_1(HelloWorld::doHide, this)); //Hide 글자를 누르면 doHide 함수를 호출
 pMenuItem2->setColor(Color3B(0, 0, 0));

 

 auto pMenu = Menu::create(pMenuItem1, pMenuItem2, NULL);

 pMenu->alignItemsVerticallyWithPadding(10.0f);

 this->addChild(pMenu);

 

    return true;
}

 

//각각 호출에 맞는 함수명을 string으로 callJavaMethod로 넘겨줌

void HelloWorld::doShow(Ref* pSender)
{
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
 callJavaMethod("ShowAdPopup");
#endif
}

void HelloWorld::doHide(Ref* pSender)
{
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
 callJavaMethod("HideAdPopup");
#endif
}

 

cocos2d-x 정리

View 라는 글자를 누르게 되면 callJavaMethod로 문자열 ShowAdPopup 을 보냄.

Hide 라는 글자를 누르게 되면 callJavaMethod로 문자열 HideAdPopup 을 보냄.

 

callJavaMethod는 매개변수로 받은 이 문자열을 c_str()로 변환하여 해당 이름으로 함수를 호출합니다.

즉 매개변수로 받는 문자열이 안드로이드에서 호출될 함수 이름입니다.

 

2. eclipse 에서 import 및 코드 설명

 

 

우선 이클립스에 필요한 목록들을 import 합시다.

자기 프로젝트의 proj.android 폴더와, google-play-services_lib 폴더를 import를 해야하는데요

 

2 - 1. 자기 프로젝트의 proj.android 폴더 부터 일단 설명하겠습니다.

 

처음엔 그냥 import를 시키면 막연한 빨간줄로 에러가 나실수 있습니다.

대부분이 참조할수 있는 cocos2d-x 라이브러리를 설정을 해주지 않아서 우선 에러가 납니다.

라이브러리 참조 방법은 제가 아는 방법은 2가지가 있습니다.

 

(참고. 첫번째 방법보단, 나중에 코드수정이나, 광고를 달거나 하는것에 있어서.. 말씀드릴 두번째 방법이 효율적이라 합니다.. 저도 왜그런지는 잘 모르겠습니다..)

 

첫째. 내프로젝트에 있는 libcocos2dx 를 import 하는겁니다.

 

 

(제 프로젝트 경로 기준... 으로 자세히 보여드리면 아래와 같은곳에 있는 라이브러리들을 가져 옵니다. )

C:\Users\BITEC-15P\Desktop\jniEx01\cocos2d\cocos\2d\platform\android\java\src\org\cocos2dx\lib

 

그럼 사진에서 보시는바와 같이 libcocos2dx 라는 폴더가 생깁니다.

import 를 하셨으면 내프로젝트에 오른쪽 클릭->Properties 클릭->Android에 들어가시면 사진과같은 화면이 뜨는데 여기서 add버튼을 눌러 참조할 라이브러리를 설정해 줍니다.

 

add누르시면 libcocos2dx 가 보이는데 클릭하고 ok후 적용해주시면 끝입니다.

 

둘째. 기존에 받았던 ex) cocos2d-x-3.0 폴더에 있는 cocos2dx 라이브러리 폴더를 내 proj.android 경로에 넣어준다

 

저는 현재 cocos2d-x-3.0을 쓰고 있습니다. 여기 안에 있는 lib폴더를 제 프로젝트의 proj.android 에 넣어주는 방법인데요.

 

우선 lib폴더의 자세한 경로는 제 기준

( C:\Users\BITEC-15P\Desktop\cocos2d-x-3.0\cocos\2d\platform\android\java\src\org\cocos2dx\lib ) 에 있습니다.

 

 

lib 폴더를 이제 나의 프로젝트 proj.android 에다가 그냥 복사만 해주시면 되는데요

 

복사하는 경로는 제 기준

( C:\Users\BITEC-15P\Desktop\jniEx01\proj.android\src\org\cocos2dx ) 여기입니다.

cpp폴더가 하나 보일텐데요 거기에 같이 lib폴더를 복사해주시면 됩니다.

 

 

 

완료하시면 이클립스에서 프로젝트를 Refresh 한번만 해주시면 아래와같이 lib가 추가된것을 확인할수 있습니다.

 

 

3. 이제 google-play-services_lib를 참조 시켜주어야 합니다.

 

예전에는 애드몹을 이용하기 위해서 jar 파일을 직접 배포하여 주었는데 이제는 그렇게 해주지 않는 대신

이 google-play-service를 사용해야 한다고 합니다.

 

우선 android sdk manager을 실행시켜서 사진에 보이시는 Google Play services가 install 되어 있지 않다면

install 해주시기 바랍니다. 그리고 혹시나 모르니까 업데이트 표시가 있으시면 업데이트도 해주시기 바랍니다.

 

 

다 설치가 완료되었으면 google-play-services_lib 를 이클립스에 우선 import 시켜서 가져와야 합니다.

이 라이브러리가 있는 경로는

 

sdk폴더->extras->google->google->google_play_services->libproject 에 있습니다.

 

import를 시키시면 아래 사진과 같이 추가가 되는데

 

이제 주의할 점이 있습니다.

google-play-service는 안드로이드 버전 4.0이상을 기준으로 제공된다고 합니다.

그래서 google-play-service 폴더, 내 안드로이드 프로젝트 버전을 4.0 이상으로 바꿔 주셔야 합니다.

 

 

google-play-service_lib 폴더와, 내프로젝트 폴더 둘다

오른쪽 클릭->Properties 클릭->Android 에 들어가서 사진에 보이시는 해당 버전에 체크 하신후 apply

하시고 ok누르고 종료 하시면 적용됩니다.

 

(혹시나 사진처럼 andorid 버전이 안보인다 하시는 분은 ... 아예 안드로이드를 이클립스에서 잘 안해보신분이라고도 할수 있는데... android sdk manager를 실행시키셔서 각각 버전들을 install 시키셔서 해당 버전 플랫폼을 설치 해주 셔야 됩니다.)

 

 

이제 여기까지 하셨으면 모든 환경설정은 다 끝입니다. 글로, 사진으로 보면 엄청 길고 오래 보일수 있는데

직접 해보면 금방합니다...(익숙하다면...)

 

4. 안드로이드 액티비티 코드 설명..

package org.cocos2dx.cpp;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import org.cocos2dx.lib.Cocos2dxActivity;

import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.graphics.Color;
import android.graphics.Point;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.Display;
import android.view.View;
import android.view.WindowManager;
import android.widget.LinearLayout;
import android.widget.Toast;

import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.AdSize;
import com.google.android.gms.ads.AdView;
 

 

@SuppressLint("HandlerLeak")
public class AppActivity extends Cocos2dxActivity {
 
 static public Handler handler;
 
 private static AppActivity _appActiviy;
 private AdView adView;
 private static final String AD_UNIT_ID = "ca-app-pub-xxxxxxxxxxxxxxxx/0000000000";
  //아까 애드몹에서 확인하셨던 게시자 id pub 번호를 저 x로 되어있는 부분에 입력해주시면 됩니다.

 

뒤에 나머지 000은 정식으로 앱에 광고를 달고 apk를 출시할때 뒷번호를 더 알려준다고 합니다 (이부분은 저도 정확하게 알고 말씀드리는건 아닙니다.)


 // Helper get display screen to avoid deprecated function use
 private Point getDisplaySize(Display d)
 {
  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
  {
   return getDisplaySizeGE11(d);
  }
  return getDisplaySizeLT11(d);
 }
 
 @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)
 private Point getDisplaySizeGE11(Display d)
 {
  Point p = new Point(0, 0);
  d.getSize(p);
  return p;
 }
 private Point getDisplaySizeLT11(Display d)
 {
  try
  {
   Method getWidth = Display.class.getMethod("getWidth", new Class[] {});
   Method getHeight = Display.class.getMethod("getHeight", new Class[] {});
   return new Point(((Integer) getWidth.invoke(d, (Object[]) null)).intValue(), ((Integer) getHeight.invoke(d, (Object[]) null)).intValue());
  }
  catch (NoSuchMethodException e2) // None of these exceptions should ever occur.
  {
   return new Point(-1, -1);
  }
  catch (IllegalArgumentException e2)
  {
   return new Point(-2, -2);
  }
  catch (IllegalAccessException e2)
  {
   return new Point(-3, -3);
  }
  catch (InvocationTargetException e2)
  {
   return new Point(-4, -4);
  }
 }
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  // TODO Auto-generated method stub
  super.onCreate(savedInstanceState);
  
  getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

  int width = getDisplaySize(getWindowManager().getDefaultDisplay()).x;

  LinearLayout.LayoutParams adParams = new LinearLayout.LayoutParams(
    width,
  LinearLayout.LayoutParams.WRAP_CONTENT);

  adView = new AdView(this);
  adView.setAdSize(AdSize.BANNER);
  adView.setAdUnitId(AD_UNIT_ID);


  AdRequest adRequest = new AdRequest.Builder()
  .addTestDevice(AdRequest.DEVICE_ID_EMULATOR)
  .addTestDevice("455611DB7112DF5A280975818FA14B5C")

//455611DB7112DF5A280975818FA14B5C 이 이상한.. 번호들은 제 스마트폰 디바이스를 뜻하는 번호입니다. 이 .addTestDevice 에 테스트용으로 실험할 디바이스 번호를 입력해 줍니다.

내 디바이스 번호를 어떻게 알아내느냐? 이것은 밑에서 설명해 드리겠습니다.

  .build();

  adView.loadAd(adRequest);
  adView.setBackgroundColor(Color.BLACK);
  adView.setBackgroundColor(0);
  addContentView(adView,adParams);
  
  _appActiviy = this;
  
  handler = new Handler()
  {
   public void handleMessage(Message msg)
   {
    if(msg.what == 0) // 핸들러 값이 0일경우 광고를 보이게한다.
    {
      showAd();
    }
    else if(msg.what == 1) // 핸들러 값이 1일경우 광고를 보이지 않게 한다.
    {
     hideAd();
    } 

   }
  };
 }
 
 public static void hideAd() // 광고 숨김 처리 함수 

{
  Log.d("Cocos2d-x","bbbbb");
  _appActiviy.runOnUiThread(new Runnable()
  {

   @Override
   public void run()
   {
    if (_appActiviy.adView.isEnabled())
     _appActiviy.adView.setEnabled(false);
    if (_appActiviy.adView.getVisibility() != 4 )
     _appActiviy.adView.setVisibility(View.INVISIBLE);
   }
  });

 }


 public static void showAd() //광고 보이게 하는 처리 함수
 {
  Log.d("Cocos2d-x","aaaaa");
  _appActiviy.runOnUiThread(new Runnable()
  {

   @Override
   public void run()
   { 
    if (!_appActiviy.adView.isEnabled())
     _appActiviy.adView.setEnabled(true);
    if (_appActiviy.adView.getVisibility() == 4 )
     _appActiviy.adView.setVisibility(View.VISIBLE); 
   }
  });

 }

 @Override
 protected void onResume() {
  super.onResume();
  if (adView != null) {
   adView.resume();
  }
 }

 @Override
 protected void onPause() {
  if (adView != null) {
   adView.pause();
  }
  super.onPause();
 }

 @Override
 protected void onDestroy() {
  adView.destroy();
  super.onDestroy();
 }

 

 //cocos2d-x(C++)에서 호출하는 함수로써 광고를 보이게 할때는 핸들러값을 0, 안보이게 할때는 1로 주고 있고 각각의 함수명은 앞서 cocos2d-x에서 callJavaMethod에 매개변수로 보내던 문자열과 동일하다. 

    public static void ShowAdPopup()   

    {
        handler.sendEmptyMessage( 0 );
    }

    public static void HideAdPopup()
    {
        handler.sendEmptyMessage( 1 );
    } 

}

 우선 너무 길어서 햇갈려 하시는 분들이 있을수도 있을것 같애서 참고 AppActivity.java 폴더를 올려 드리겠습니다.

 

jniAppActivity.java

 

이 소스의 모든것을 다 아실필요는 없고 전부다 복사해서 쓰면 되는겁니다. 세세한, 광고의 위치라던지, 기능이라던지 등을 jni의 흐름을 아시고 그런 부분만 맞게 코딩 해주시면 됩니다.

 

5. 내 프로젝트에 있는 AndroidManifest.xml 수정

 

(굵은 글씨로 되어있는 부분 추가해 주시면 됩니다.)

 

 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.study.jni01"
      android:versionCode="1"
      android:versionName="1.0">

    <uses-sdk android:minSdkVersion="9"/>
    <uses-feature android:glEsVersion="0x00020000" />

    <application android:label="@string/app_name"
                 android:icon="@drawable/icon">


        <activity android:name="org.cocos2dx.cpp.AppActivity"
                  android:label="@string/app_name"
                  android:screenOrientation="landscape"
                  android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
                  android:configChanges="orientation">
            <!-- Tell NativeActivity the name of our .so -->
            <meta-data android:name="android.app.lib_name"
                       android:value="cocos2dcpp" />

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
       
        <!-- Admob meta-data and activity start -->
        <meta-data android:name="com.google.android.gms.version"
                  android:value="@integer/google_play_services_version"/>
        <activity android:name="com.google.android.gms.ads.AdActivity"

             android:configChanges=

"keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/>
         <!-- Admob meta-data and activity end -->

       
    </application>

    <supports-screens android:anyDensity="true"
                      android:smallScreens="true"
                      android:normalScreens="true"
                      android:largeScreens="true"
                      android:xlargeScreens="true"/>

    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
</manifest>

 

 

6. 그럼 아까 설명에서 내 디바이스 번호를 어떻게 알아내느냐?

 

그것은 이클립스에서 스마트폰으로 포팅할때

LogCat 화면에서 내 디바이스 번호를 확인할수 있습니다.

 

포팅준비

 

1. 포팅 할때 우선 visual studio에서 폴더를 일단 빌드 합니다.
2. build_native.py 를 실행한다

(이클립스에서 보이는거 실행해도 되고, cmd창으로 proj.android 안에 있는 builde_native.py를 실행하면 됨)

3. addTestDevice 함수에 아무 문자열이나 넣는다 ex) addTestDevice("test");

4. 스마트폰을 usb로 연결하고 프로젝트 Run As 를 시킨다.

 

사진에 보시는것처럼 로그켓에 내 디바이스 번호가 뜨게됩니다.

저 번호를 addTestDevice 안에 문자열로 적어주시면 됩니다.

 

 

거의 마무리인데요.

.addTestDevice 이 함수를 테스트버전에서 사용할때 이것을 사용하지 않으면.. 뭐 애드몹이 정지를 먹을수도 잇다고 합니다.. (테스트라는걸 반드시 상기시켜줘야하는건가..? 뭐 확실치는 않음...)

 

그리고 정식 배포용으로써 광고를 달게 될때는 .addTestDevice 함수는 사용하지 않는다고 합니다. 즉 삭제를 하라 이말이죠.

 

   AdRequest adRequest = new AdRequest.Builder()
  .addTestDevice(AdRequest.DEVICE_ID_EMULATOR) //삭제
  .addTestDevice("455611DB7112DF5A280975818FA14B5C") //삭제

 

그리고 앞에서

private static final String AD_UNIT_ID = "ca-app-pub-0000000000000000/0000000000";

이부분을 앞에 게시자 ID 값을 주지않고 저렇게 다 0으로 해버리면 광고가 뜨지 않습니다.

혹여나 이렇게 하고 안뜬다고 고민 하지마세요.

 

 

 

정상적으로 포팅이 되셨으면 아래 사진과 같이 광고가 나옵니다

View 를 누르면 광고가 나오고 Hide를 누르면 광고가 사라지고 ㅇㅇㅇ

 

 

 

728x90
Posted by 정망스
,


맨 위로
홈으로 ▲위로 ▼아래로 ♥댓글쓰기 새로고침