코로나 네이티브는 기존 엔터프라이즈의 기능과 동일합니다.
콜백 함수보다는 이벤트를 이용하는걸 추천합니다.

[ objective-c :: AppCoronaDelegate.mm ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#import "AppCoronaDelegate.h"

#import <CoronaRuntime.h>
#import <CoronaLua.h>

@implementation AppCoronaDelegate

id<CoronaRuntime> _runtime;

AppCoronaDelegate *_this;

- (void)willLoadMain:(id<CoronaRuntime>)runtime
{
    _runtime = runtime;
    _this = self;
   
    lua_State *L = runtime.L;
   
    const luaL_Reg kFunctions[] =
    {
        "call", callFromCorona,
       
        NULL, NULL
    };
   
    luaL_register( L, "native", kFunctions );
    lua_pop( L, 1 );
}

static int
callFromCorona( lua_State *L )
{
    int luaTableStackIndex;
   
    //----------------- string Begin -----------------//
    luaTableStackIndex = 2;
    const char *value = luaL_checkstring( L, luaTableStackIndex );
    NSLog( @"1======== %s", value );
   
    NSString *vStr = @(value);
    if([vStr isEqualToString:@"begin"])
    {
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
            [_this begin];
        });
    }
    //----------------- string End -----------------//
   
    NSString *_x;
    NSString *_y;
   
    //----------------- table Begin -----------------//
    luaTableStackIndex = 3;
    if ( lua_istable( L, luaTableStackIndex ) )
    {
        NSLog( @"2====get x, y:");
        _x = getLuaTableEntryValueFrom(L, luaTableStackIndex, "x");
        _y = getLuaTableEntryValueFrom(L, luaTableStackIndex, "y");
    }
    else
    {
        NSLog(@"printTableValuesXY: argument is not a table");
    }
    //----------------- table End -----------------//
   
    //----------------- callback function Begin -----------------//
    luaTableStackIndex = 1;
    if ( lua_isfunction( L, luaTableStackIndex ) )
    {
        NSLog( @"3========");
        // 함수를 등록합니다. 전달할 인수가 아님에 주의하세요.
        lua_pushvalue( L, 1 );
       
        lua_pushstring( L, [_x UTF8String] );
        lua_pushstring( L, [_y UTF8String] );
       
        // 첫 번째 인수는 루아 함수에 전달할 인수의 개수를 나타냅니다.
        // 두 번째 인수는 Lua 함수에서 받아 들일 반환 값의 수를 나타냅니다.
        lua_call( L, 2, 0 );
    }
    else
    {
        luaL_typerror( L, luaTableStackIndex, lua_typename( L, LUA_TFUNCTION ) );
    }
    //----------------- callback function End -----------------//
   
    return 0;
}

static NSString *
getLuaTableEntryValueFrom( lua_State *L, int stackIndex, const char *name )
{
    NSString *valueString = nil;
   
    lua_getfield( L, -1, name );
   
    if (lua_isnumber( L, -1))
    {
        valueString = [NSString stringWithFormat:@"%f", lua_tonumber( L, -1 )];
    }
    else
    {
        valueString = [NSString stringWithFormat:@"%s", lua_tostring( L, -1 )];
    }
   
    lua_pop( L, 1 );
   
    return valueString;
}

- (void)didLoadMain:(id<CoronaRuntime>)runtime
{
}

-(void) begin
{
}

...

@end

[ Lua ]

1
2
3
4
local stringValue = "this is from Lua."
native.call(function (x, y)
    print("this is from Native!! data: ("..x..", "..y..")")
end, stringValue, {x=55, y=77})

[ 결과 ]

1
2
3
4
1======== this is from Lua.
2====get x, y:
3========
this is from Native!! data: (55.000000, 77.000000)