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 는 맥이 없어 못해봤으니 차후 하게되면 업데이트 하겠음