c言語でflashに書くandroid ane(ネイティブ拡張)

6951 ワード

ツール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 2つのファイルをextensionフォルダの下に入れます.
9.aneファイル(helloworld.ane)を生成し、extendsionの同じレベルのディレクトリで実行します.
adt -package -target ane helloworld.ane myane.xml -swc *.swc -platform Android-ARM -C extension .
10.flash as 3で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が見えます!!!ご成功おめでとうございます.