2015. 11. 18. 18:44

ANE 만들기

#IntelliJ를 사용

1. 프로젝트를 Android - Gradle: Android Module 선택


2. 패키지명은 여러곳에서 사용하니 잘 정할 것. 

  "New Project" 창에서 Theme => None, Create activity 는 체크해제후 프로젝트를 생성한다.

  !!중요 minSdk, targetSdk, compileSdk 를 최신버전으로 선택하고 프로젝트를 생성해야 아래와 같은 오류가 발생하지 않는다.

   프로젝트를 생성한 후에 app/build.gradle 에서 Sdk 버전을 변경하자.

   minSdk 를 낮은 버전으로 할 경우 하위버전에서 상위버전의 UI를 사용하기 위해 appcompat_v7이란 디렉토리가 생기고 그로인해서 오류가 발생하니 주의할 것.


참고!!

  #Error:Gradle: Execution failed for task ':app:processDebugResources'.

> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '경로\Android\android-sdk\build-tools\22.0.1\aapt.exe'' finished with non-zero exit value 1


3. FlashRuntimeExtensions.jar 파일을 프로젝트의 libs 경로에 복사

   FlashRuntimeExtensions.jar 파일은 AIRSDK설치경로\lib\android 에보면 있다.


4. app/build.gradle 파일을 열어 

   apply plugin 의 com.android.application 값을 com.android.library 로 변경하고

   library는 applicationId를 가질 수 없으니 applicationId 를 주석처리 한다.


5. app/src/main/java/패키지명 밑에 아래 3종류의 파일을 작성한다.(앞의 ___는 아무 이름이나 해)

  ___Extension.java : Native기능을 생성?하는 파일

  ___Context.java : 외부에서 호출한 메소드를 실제 클래스로 매핑되는 정보를 정의하는 파일

  ___Function.java : 실제 기능을 구현하는 파일

  

___Extension.java 파일 ----------------------------------------

@Override

public FREContext createContext(String s) {

    Log.e("___Extension", "call createContext");

    return new ___Context();  //생성한 ___Context() 클래스를 리턴해주면 됨

}


___Context.java 파일 ----------------------------------------

@Override

public Map<String, FREFunction> getFunctions() {

    Map<String, FREFunction> map = new HashMap<String, FREFunction>();

    map.put("getSample", new ___Function());  //외부에서는 getSample 로 호출하고 실제 기능은 ___Function

    return map;

}


___Function.java 파일 ----------------------------------------

@Override

public FREObject call(FREContext freContext, FREObject[] args) {

    return null; //이곳에 기능을 구현한다

}


참고로 이 파일에서 아래와 같이 Air에서 사용중인 activity를 가져올 수 있으며

Activity activity =  freContext.getActivity();


전달된 인자값은 아래와 같이 타입을 지정해서 받는다.

Boolean flag =  args[0].getAsBool(); //getAsInt(), getAsDouble(), getAsBool(), getAsString() 사용가능


6. Build(Make Project, Rebuild Project)를 하면 app/build/outputs/aar 에 app-debug.arr 파일이 생성된다.

   이 파일을 압축프로그램(반디집)등으로 압축해제하면 classes.jar 파일이 있는데 파일이 프로그램이니 이름을 바꿔서 저장하자.


7. Air와 ane를 연결할 swc 만들기

  새 프로젝트 - Flash 선택, 

  Target platform : Mobile 선택, Pure Acriotnscript 체크

  Output type : Libray 선택

  Flex/Air SDK : Air_sdk 버전 선택 후 프로젝트 생성

  

 /src/패키지명/__클래스명.as 클래스 생성


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
package 패키지명
{
    import flash.events.Event;
    import flash.events.EventDispatcher;
    import flash.events.IEventDispatcher;
    import flash.events.StatusEvent;
    import flash.external.ExtensionContext;
 
    public class __클래스명 extends EventDispatcher
    {
        private static const EXTENSION_ID:String = "패키지명";
        private var context:ExtensionContext;
 
        public function __클래스명(target:IEventDispatcher = null)
        {
            super(target);
 
            try {
                context = ExtensionContext.createExtensionContext(EXTENSION_ID, null);
                context.addEventListener(StatusEvent.STATUS, onStatusHandler);
            } catch(e:Error) {
                trace(e.message, e.errorID);
            }
        }
 
        private function onStatusHandler(e:Event):void
        {
 
        }
 
        public function getSample(flag:Boolean):void
        {
            context.call("getSample", flag); //___Context.java 파일에 정의 메소드명
        }
    }
}
cs


SWC 파일을 각각 만든다(ios, android, default)

그리고 swc 파일을 압축툴로 열어보면 library.swf 파일이 있을텐데 그걸 각각 놔둔다.

 


8. extension.xml 작성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<extension xmlns="http://ns.adobe.com/air/extension/17.0">
    <id>com.sample</id<!-- 패키지명 -->
    <versionNumber>1.1</versionNumber>
    <platforms>
        <platform name="iPhone-ARM">
            <applicationDeployment>
                <nativeLibrary>ios_filename.a</nativeLibrary<!-- IOS 라이브러리파일 -->
                <initializer>ExtInitializer</initializer<!-- 초기화 메소드명 -->
                <finalizer>ExtFinalizer</finalizer<!-- 종료 메소드명 -->
            </applicationDeployment>
        </platform>
        <platform name="Android-ARM">
            <applicationDeployment>
                <nativeLibrary>android_filename.jar</nativeLibrary<!-- ANDROID 라이브러리파일 -->
                <initializer>com.sample.___Extension</initializer<!-- 패키지명.___Extension 클래스명 -->
            </applicationDeployment>
        </platform>
    </platforms>
</extension>
cs


9. 필요한 경우 platform.xml 파일을 사용하여 플랫폼 별로 추가로 포함되어야 하는 jar 또는 리소스등을 설정할 수도 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<platform xmlns="http://ns.adobe.com/air/extension/21.0"
    <packagedDependencies
        <packagedDependency>android-support-v4.jar</packagedDependency>
    </packagedDependencies
    <packagedResources
        <packagedResource
            <packageName>com.ane.googleplusapi</packageName
            <folderName>res</folderName
        </packagedResource
        <!-- <packagedResource> 
            <packageName>com.android.support</packageName> 
            <folderName>res2</folderName> 
        </packagedResource> -->
    </packagedResources>
</platform>
cs


10. ANT 로 컴파일을 하기 위해 build.xml 을 작성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0" encoding="UTF-8"?>
<project name="Air Native Extension Build Scripts" default="package">
     <property name="name" value="파일명"/>
    <property name="sdk.home" value="AIRSDK경로"/>
    <property name="bin.ext" value=".bat"/<!-- 이건 실행파일 확장자, 윈도우는 .bat, 리눅스 계열은 공백  -->
 
    <target name="package" description="Create the extension package">
        <exec executable="${sdk.home}/bin/adt${bin.ext}" failonerror="true" dir="./">
            <arg value="-package"/>
            <arg value="-target"/>
            <arg value="ane"/>
            <arg value="${name}.ane"/>
            <arg value="./extension.xml"/>
            <arg line="-swc ${name}.swc"/>
            <arg line="-platform iPhone-ARM -platformoptions platform.xml -C /ios용경로 library.swf ios_filename.a"/>
            <arg line="-platform Android-ARM -C /android용경로  library.swf android_filename.jar"/>
            <arg line="-platform default -C /기본용경로 library.swf"/>
        </exec>
    </target>
</project>
 
cs

위 내용중에 library.swf 파일은 아까 각각 만든 SWC 파일에서 풀어놓은 library.swf 를 사용하면 되고.

-C 옵션은 경로를 설정하는 옵션이다.

그리고 메인에 사용되는 ${name}.swc 이 파일은 위에서 만든 swc 아무거나 하나 사용하면 된다.




11. ant 를 실행해서 빌드 (ant 경로는 path로 잡혀있어야 함)

참고로 폴더에는 아래 파일들이 다 있어야 한다. ___ 파일명은 동일하게 하는게 좋음, 아니면 build.xml에서 고칠것

____.jar

____.a

build.xml

extension.xml

library.swf

____.swc


12. IOS 는 맥이 없어 못해봤으니 차후 하게되면 업데이트 하겠음