Hello!
I'm trying to build sample native extension written with C++ on Android device.
But I have some troubles caused by the error #3500.
What I have:
1) Code of native library;
#include "FlashRuntimeExtensions.h"
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
FREObject nativeFunction(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[])
{
uint32_t length = 12;
const uint8_t* value = (const uint8_t*)"Hello from C";
FREObject retObject;
int res = FRENewObjectFromUTF8(length, value, &retObject);
if (res == FRE_OK) {
return retObject;
} else {
return NULL;
}
}
void ContextInitializer(void *extData, const uint8_t *ctxType, FREContext ctx,
uint32_t *numFunctionsToSet,
const FRENamedFunction **functionsToSet)
{
FRENamedFunction* func = (FRENamedFunction*)malloc(sizeof(FRENamedFunction)*1);
func[0].name = (const uint8_t*)"nativeFunction";
func[0].functionData = NULL;
func[0].function = &nativeFunction;
*functionsToSet = func;
}
void ContextFinalizer(FREContext ctx)
{
return;
}
void NativeCppExtensionInitializer(void** extDataToSet, FREContextInitializer* ctxInitializerToSet,
FREContextFinalizer* ctxFinalizerToSet)
{
extDataToSet = NULL;
*ctxInitializerToSet = ContextInitializer;
*ctxFinalizerToSet = ContextFinalizer;
}
void NativeCppExtensionFinalizer(void* extData)
{
return;
}
2) ActionScript library with Extension class:
package com.adobe.cppnativeextension
{
import flash.external.ExtensionContext;
public class CppNativeExtension
{
private static var context:ExtensionContext;
public static function init():void {
if (!context) {
context = ExtensionContext.createExtensionContext('com.adobe.nativecpp', '');
}
}
public static function nativeFunction():String {
if (context != null) {
return context.call('nativeFunction') as String;
}
return null;
}
}
}
3) Test mobile application:
<?xml version="1.0" encoding="utf-8"?>
<s:View xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark" title="Home">
<fx:Script>
<![CDATA[
import com.adobe.cppnativeextension.CppNativeExtension;
public function button1_clickHandler(event:MouseEvent):void
{
CppNativeExtension.init();
var res:String = CppNativeExtension.nativeFunction();
btn1.label = res;
}
]]>
</fx:Script>
<s:Button id="btn1" x="25" y="27" label="Launch native function" click="button1_clickHandler(event)"/>
</s:View>
My application.xml file looks like:
<extension xmlns="http://ns.adobe.com/air/extension/3.1">
<id>com.adobe.nativecpp</id>
<versionNumber>1</versionNumber>
<platforms>
<platform name="Android-ARM">
<applicationDeployment>
<nativeLibrary>libnativecpp.so</nativeLibrary>
<initializer>NativeCppExtensionInitializer</initializer>
<finalizer>NativeCppExtensionFinalizer</finalizer>
</applicationDeployment>
</platform>
</platforms>
</extension>
Native library libnativecpp.so is built with Android NDK for Windows for ARM architecture.
After building ANE archive has such structure:
-- META-INF
------ ANE
---------- Android-ARM
-------------- libnativecpp.so
-------------- library.swf
---------- extension.xml
-- mimetype
-- catalog.xml
-- library.swf
After launching of mobile app in debug mode I receive such error:
ArgumentError: Error #3500: The extension context does not have a method with the name nativeFunction.
What did I do wrong?
Thanks for help in advance.