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
3.cコードtestを書く.c:
4.libmyを生成する.soファイル:
jniディレクトリndk-buildの実行
obj/local/armeabi/でlibmyを見つけることができます.soは、コンパイルに成功したことを示し、
5.aneのプロファイル(現在の作業ディレクトリの下にmyane.xmlを新規作成):
6.flashインタフェースファイル(現在の作業ディレクトリの下にMyExtension.asを新規作成):
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:
11.swfファイルを生成する:
amxmlc Main.as -library-path+=myExtension.swc -debug=true -output Test.swf
12.airプロファイルmy-app.xml:
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が見えます!!!ご成功おめでとうございます.
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が見えます!!!ご成功おめでとうございます.