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