使用工具 flex sdk 4.6,android-ndk,运行环境fedora 17(windows环境下也可)。
flex及android-ndk安装配置我就不说了,网上有大把的文章介绍。
原创作品,转载时请保留原作者信息
1,在工作目录下新建jni文件夹,将flex sdk的lib目录下的android/FlashRuntimeExtensions.so文件,include目录下的,FlashRuntimeExtensions.h复制到jni目录下。
2.在jni目录下新建一个makefile文件:Android.mk
include $(CLEAR_VARS) LOCAL_MODULE := flash LOCAL_SRC_FILES := FlashRuntimeExtensions.so include $(PREBUILT_SHARED_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := my LOCAL_SHARED_LIBRARIES := flash LOCAL_SRC_FILES := test.c#源代码为第3点的代码 include $(BUILD_SHARED_LIBRARY)
3.写c代码test.c:
#include<FlashRuntimeExtensions.h> #include <stdlib.h> #include <string.h> FREObject test(FREContext ctx,void*funcData,uint32_t argc,FREObject argv[]) { const uint8_t* msg = (const uint8_t*)"Hello world!!!!"; FREObject retObj; FRENewObjectFromUTF8(strlen((const char*)msg)+1, msg, &retObj); return retObj; } void ContextInitializer(void* extData, const uint8_t* ctxType,FREContext ctx,uint32_t* numFunctionsToTest,const FRENamedFunction** functionsToSet) { *numFunctionsToTest= 1; FRENamedFunction*func = (FRENamedFunction*)malloc(sizeof(FRENamedFunction)*1); func[0].name= (const uint8_t*)"test"; func[0].functionData= NULL; func[0].function= &test; *functionsToSet= func; } void ContextFinalizer(FREContext ctx) { return; } void ExtInitializer(void** extDataToSet, FREContextInitializer* ctxInitializerToSet,FREContextFinalizer* ctxFinalizerToSet){ *extDataToSet= NULL; *ctxInitializerToSet= ContextInitializer; *ctxFinalizerToSet= ContextFinalizer; } void ExtFinalizer(void* extData){ return; }
4.生成libmy.so文件:
jni目录运行ndk-build
在obj/local/armeabi/可以找到libmy.so,表示编译成功,
5.ane的配置文件(当前工作目录下新建myane.xml):
<extension xmlns="http://ns.adobe.com/air/extension/3.1"> <id>libiao.MyExtension</id> <versionNumber>1.0.0</versionNumber> <platforms> <platform name="Android-ARM"> <applicationDeployment> <nativeLibrary>libmy.so</nativeLibrary> <initializer>ExtInitializer</initializer> <finalizer>ExtFinalizer</finalizer> </applicationDeployment> </platform> </platforms> </extension>
6.flash接口文件(当前工作目录下新建MyExtension.as):
package { import flash.events.EventDispatcher; import flash.external.ExtensionContext; public class MyExtension extends EventDispatcher { private static var context:ExtensionContext; public function MyExtension() { super(); try { context= ExtensionContext.createExtensionContext("libiao.MyExtension",""); }catch(e:Error){} } public function say():String { var str:String = context.call("test") as String; return str; } } }
7.生成swc文件(当前目录下运行):
acompc -source-path . -include-classes MyExtension -swf-version=14 -output myExtension.swc
8.用unzip将myExtension.swc中的library.swf解压出来,新建一个文件夹extension,将library.swf和 obj/local/armeabi/下的libmy.so两个文件放入extension文件夹下。
9.生成ane文件(helloworld.ane),在extendsion的同一级目录下运行:
adt -package -target ane helloworld.ane myane.xml -swc *.swc -platform Android-ARM -C extension .
10.flash as3中用ane:
Main.as:
package { import flash.display.Sprite; import flash.text.TextField; /** * ... * @author db0@qq.com */ public class Main extends Sprite { private var ext:MyExtension = new MyExtension(); private var ta:TextField = new TextField(); public function Main():void { addChild(ta); ta.text = ext.say(); } ) }
11.生成swf文件:
amxmlc Main.as -library-path+=myExtension.swc -debug=true -output Test.swf
12.air配置文件my-app.xml:
<application xmlns="http://ns.adobe.com/air/application/3.1"> <supportedProfiles>mobileDevice</supportedProfiles> <extensions> <extensionID>libiao.MyExtension</extensionID> </extensions> <id>ExtensionTest</id> <filename>ExtensionTest</filename> <name>ExtensionTest</name> <versionNumber>1.0.0</versionNumber> <initialWindow> <content>Test.swf</content> <visible>true</visible> <systemChrome>none</systemChrome> <transparent>false</transparent> <minimizable>false</minimizable> <maximizable>false</maximizable> <resizable>false</resizable> <aspectRatio>landscape</aspectRatio> <autoOrients>false</autoOrients> <renderMode>auto</renderMode> </initialWindow> <android> <manifestAdditions> <![CDATA[ <manifest> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.RECORD_AUDIO"/> <uses-permission android:name="android.permission.DISABLE_KEYGUARD"/> <uses-permission android:name="android.permission.WAKE_LOCK"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> </manifest> ]> </manifestAdditions> </android> </application>
13.打包成apk(main.apk):
adt -package -target apk -storetype pkcs12 -keystore my.p12 -storepass fd main.apk my-app.xml -extdir . Test.swf
14.在手机上运行main.apk,可以看到helloword!!!,恭喜你大功告成。