用c语言为flash写的android ane(本机扩展)

使用工具 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 [email protected]

         */

        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!!!,恭喜你大功告成。

你可能感兴趣的:(用c语言为flash写的android ane(本机扩展))