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

[ CoronaApplication.java ]

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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
package com.wonhada.wonhadacorona;

import android.content.Context;
import android.content.res.Resources;
import android.util.Log;

import com.ansca.corona.CoronaActivity;
import com.ansca.corona.CoronaEnvironment;
import com.naef.jnlua.LuaState;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.HashMap;

public class CoronaApplication extends android.app.Application {
    public static String LOG_ID = "WonhadaCorona";

    @Override
    public void onCreate() {
        super.onCreate();
        com.ansca.corona.CoronaEnvironment.addRuntimeListener(new CoronaApplication.CoronaRuntimeEventHandler());
    }

    private class CoronaRuntimeEventHandler implements com.ansca.corona.CoronaRuntimeListener {
        private String LOG_ID = CoronaApplication.LOG_ID;

        @Override
        public void onLoaded(com.ansca.corona.CoronaRuntime runtime) {
            com.naef.jnlua.NamedJavaFunction[] luaFunctions;

            // 런타임에서 Lua state를 가져옵니다.
            com.naef.jnlua.LuaState luaState = runtime.getLuaState();

            // 다음 함수를 가진 "native"라는 모듈을 루아에 추가합니다.
            luaFunctions = new com.naef.jnlua.NamedJavaFunction[] {
                    new NativeCall()
            };
            luaState.register("native", luaFunctions);
            luaState.pop(1);
        }

        @Override
        public void onStarted(com.ansca.corona.CoronaRuntime runtime) {
        }

        @Override
        public void onSuspended(com.ansca.corona.CoronaRuntime runtime) {
        }

        @Override
        public void onResumed(com.ansca.corona.CoronaRuntime runtime) {
        }

        @Override
        public void onExiting(com.ansca.corona.CoronaRuntime runtime) {
        }
    }
}

class NativeCall implements com.naef.jnlua.NamedJavaFunction {
    private String LOG_ID = CoronaApplication.LOG_ID;

    @Override
    public String getName() {
        return "call";
    }

    @Override
    public int invoke(com.naef.jnlua.LuaState L) {
        try {
            int luaTableStackIndex;

            //----------------- string Begin -----------------//
            luaTableStackIndex = 2;
            String value = L.checkString(luaTableStackIndex );
            Log.d( LOG_ID, "1======== " + value );

            if(value.equals("begin"))
            {
                ((MainActivity)CoronaEnvironment.getCoronaActivity()).begin();
            }
            //----------------- string End -----------------//

            String _x = "";
            String _y = "";

            //----------------- table Begin -----------------//
            luaTableStackIndex = 3;
            if ( L.isTable( luaTableStackIndex ) )
            {
                L.pushNil();
                Log.d( LOG_ID, "2====get x, y:");
                HashMap<String, String> map = getLuaTable(L, luaTableStackIndex);
                for (String name: map.keySet()) {
                    String _key = name.toString();
                    String _value = map.get(name).toString();
                    Log.d( LOG_ID, _key + ":" + _value);
                }
                _x = map.get("x");
                _y = map.get("y");
            }
            else
            {
                Log.d( LOG_ID, "argument is not a table");
            }
            //----------------- table End -----------------//

            //----------------- callback function Begin -----------------//
            luaTableStackIndex = 1;
            if ( L.isFunction( luaTableStackIndex ) )
            {
                Log.d( LOG_ID, "3========");

                // 함수를 등록합니다. 전달할 인수가 아님에 주의하세요.
                L.pushValue(luaTableStackIndex);

                L.pushString(_x);
                L.pushString(_y);

                // 첫 번째 인수는 루아 함수에 전달할 인수의 개수를 나타냅니다.
                // 두 번째 인수는 Lua 함수에서 받아 들일 반환 값의 수를 나타냅니다.
                L.call(2, 0);
            }
            else
            {
                Log.d( LOG_ID, "argument is not a function");
            }
            //----------------- callback function End -----------------//
        }
        catch (Exception ex) {
            ex.printStackTrace();
        }

        return 0;
    }

    private HashMap<String, String> getLuaTable(LuaState L, int luaTableStackIndex) {
        HashMap<String, String> map = new HashMap<String, String>();

        for (L.pushNil(); L.next(luaTableStackIndex); L.pop(1)) {
            String keyName = null;
            com.naef.jnlua.LuaType luaType = L.type(-2);
            switch (luaType) {
                case STRING:
                    keyName = L.toString(-2);
                    break;
                case NUMBER:
                    keyName = Integer.toString(L.toInteger(-2));
                    break;
            }
            if (keyName == null) {
                continue;
            }

            String valueString;
            luaType = L.type(-1);
            switch (luaType) {
                case STRING:
                    valueString = L.toString(-1);
                    break;
                case BOOLEAN:
                    valueString = Boolean.toString(L.toBoolean(-1));
                    break;
                case NUMBER:
                    valueString = Double.toString(L.toNumber(-1));
                    break;
                default:
                    valueString = luaType.displayText();
                    break;
            }
            if (valueString == null) {
                valueString = "";
            }

            map.put(keyName, valueString);
        }

        return map;
    }
}

[ MainActivity.java ]
– 메인 액티비티 변경 시 매니페스트를 수정해야 합니다.

1
2
3
<activity android:name="com.ansca.corona.CoronaActivity"
=>
<activity android:name="com.wonhada.wonhadacorona.MainActivity"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package com.wonhada.wonhadacorona;

import android.util.Log;

import com.ansca.corona.CoronaActivity;

public class MainActivity extends CoronaActivity {
    private String LOG_ID = CoronaApplication.LOG_ID;

    public MainActivity() {
        super();
    }

    public void begin()
    {
        Log.d(LOG_ID, "begin!!!");
    }
}

[ 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
5
6
1======== this is from Lua.
2====get x, y:
x:55.0
y:77.0
3========
this is from Native!! data: (55.0, 77.0)