노력과 삽질 퇴적물

ANE: 안드로이드용 AIR 개발설정 본문

📂게임개발 note/모바일 개발

ANE: 안드로이드용 AIR 개발설정

MTG 2013. 11. 28. 11:26






0. 필요한 파일


파일명

예시 경로

 JDK(Java Developement Kit) SE

 C:\Java\jdk1.7

 이클립스

 C:\eclipse

 안드로이드 android-sdk

 C:\android-sdk-windows
 안드로이드 개발 툴킷(ADT)

 (이큽립스 플러그인)

 플래시 빌더

 C:\Program Files\Adobe\Adobe Flash Builder 4.6

 FlashRuntimeExtensions.jar

(xocode에서는 FlashRuntimeExtension.h)

 (이클립스 프로젝트)\lib\FlashRuntimeExtensions.jar

(4.6기준으로 C:\Program Files\Adobe\Adobe Flash Builder 4.7\sdks\4.6.0\lib\android에서 찾아볼수 있습니다.)






0. 설치하기 & 기본세팅

 

안드로이드: 개발환경 구축 참조.






1. 네이티브 코드, 이클립스


① 클래스 작성

->총 3가지 종류의 클래스가 필요하다.

xxxExtension

 xxxContext

 xxxFunction

 1개만 필요.

 xxxContext를 상속한 객체 반환

 1개만 필요.

 getFunctions()에서 as에 연동할 함수명을 문자열로 지정. (함수에 태그명 붙이기?)

 1개 이상 생성 가능.

 call함수에서 사용하고자 하는 순수 안드로이드 기능등을 구현.

... ... ...

public class NativeExtension implements FREExtension
{
   public static NativeContext _context = null;

   @Override
   public FREContext createContext(String arg0)
   {

      if (context  == null)

         _context  = new NativeContext();

      return _context;
   }

... ... ...

   (xxxFunction에서 사용할 함수)

... ... ...
   @Override
   public void dispose()
   {
      context.dispose();
      context = null;
   }

   @Override
   public void initialize()   {    }
}

... ... ...

public class NativeContext extends FREContext implements ...
{
... ... ...

... ... ...
    @Override
    public void dispose()   {   }

    @Override
    public Map<String, FREFunction> getFunctions()
    {
        Map<String, FREFunction> funcMap = new HashMap<String, FREFunction>();
        functionMap.put("androidToast",    new NativeFunc1());
... ... ...
        return funcMap;
    }
}








... ... ...

public class NativeFunc1 implements FREFunction
{
   @Override
   public FREObject call(FREContext cont, FREObject[] arg1)
   {
      FREObject result = null;
      ... ... ...
      NativeExtension._context.

      ... ... ...
      return null;
    }
}
















② JAR export


③ JAR파일 편집.

안드로이드 API함수말고 jat로 된 외부라이브러리를 사용해야 할 경우,

(FlashRuntimeExtensions.jar 제외)대상이 되는 라이브러리 파일을 압축해제(파일명 경로 생성X / 그냥풀기O)를 하고 해당 폴더와 방금 export시킨 jar파일을 같은 폴더 경로에 넣고 CMD등으로 [jar -uf]명령어를 사용합니다.

예. jar -uf text.jar unzipedFolder

(META-INF는 안 해도 무관한거 같습니다.)






2. 플래시 빌더


!!!주의사항!!!

프로젝트 생성시, Library Project를 확인해야 합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
//  (프로젝트 폴더)\src\air\analoggreen\AndroidLibrary.as
package air.analoggreen
{
    import flash.events.Event;
    import flash.events.EventDispatcher;
    import flash.events.StatusEvent;
    import flash.external.ExtensionContext;
 
    public class AndroidLibrary extends EventDispatcher
    {
        private static var context:ExtensionContext = null;
        private var errStr:String;
        
        public function ExtensionAPI()
        {
            if(context == null)
                context = ExtensionContext.createExtensionContext("air.analoggreen.AndroidLibrary"null);
        }
 
        public function getAndroidAPI(command:int, msgArr:Array=null):void
        {
            context.addEventListener(StatusEvent.STATUS, onStatus);
            
            if(command == 0)        {    context.call("androidToast",    msgArr);    }
            else if(command == 1)    {    context.call("androidVibrate", msgArr);        }
            else if(command == 2)    {    context.call("androidAlert",     msgArr);    }
            ... ... ...
        }
        
        private function onStatus(e:StatusEvent):void
        {
            dispatchEvent(new Event(e.code));
            context.removeEventListener(StatusEvent.STATUS, onStatus);
        }
    }
}


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!--  (프로젝트 폴더)\bin\extension.xml -->
<extension xmlns="http://ns.adobe.com/air/extension/3.1">
    <id>air.analoggreen.AndroidLibrary</id>
    <versionNumber>1</versionNumber>
    <platforms>
        <platform name="Android-ARM">
            <applicationDeployment>
                <nativeLibrary>androidNative.jar</nativeLibrary>
                <!-- 네이티브 코드 패키지경로 -->
                <initializer>com.analoggreen.androidNative</initializer>
                <finalizer>com.analoggreen.androidNative</finalizer>
            </applicationDeployment>
        </platform>
    </platforms>
</extension>






3. ANE빌드

 

플래시 빌더에서 빌드하면 필요한 ANE파일이 생성될테지만, 에러가 빈번해서 BAT을 이용한 수 빌드 방식을 사용했습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
: (프로젝트 폴더)\create_ane.bat
set adt_directory=C:\Program Files\Adobe\Adobe Flash Builder 4.6\sdks\4.6.0\bin
set root_directory=C:\workspace-flash\Adobe Flash Builder and ANE
set library_directory=%root_directory%\androdiANE
set native_directory=%root_directory%\androidAne\lib
set signing_options=-storetype pkcs12 -keystore "C:\workspace\androidANE\cret.p12" -tsa none
set dest_ANE=AndroidANE.ane
set extension_XML=%native_directory%\extension.xml
set library_SWC=%library_directory%\AndroidLibrary.swc
 
"%adt_directory%"\adt -package %signing_options% -target ane "%dest_ANE%" "%extension_XML%" -swc "%library_SWC%" -platform Android-ARM -C "%native_directory%" .
 
pause






4. 액션스크립트

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package
{
    import air.analoggreen.AndroidLibrary;
     
    import flash.display.Sprite;
    import flash.events.Event;
     
    public class ANE_test extends Sprite
    {
        private var andLib:AndroidLibrary;
 
        public function TestToast()
        {
            super();
            andLib:AndroidLibrary = new andLib:AndroidLibrary();
            ... ... ...
        }
 
        private function onClick(e:Event):void
        {
            andLib.getAndroidAPI(0new Array("test_for_toast"));
            andLib.getAndroidAPI(1);
            ... ... ...
        }
    }
}
 
cs





기타. 참고자료


YeonMee's Tistory :: ANE 관련 정리 자료

남자는 코딩 :: AIR Native Extension - ANE 만들기 for Android

Adobe Flash Builder 4.5 - AIR로 iOS, 안드로이드 어플을 개발하자. -지돌스타 - 쿠키랩 블로그-

일자

변경이력

2013-11-28

 초안