Lua for Android in cocos2d-1.0.1-x-0.10.0

Hi,

I’ve followed this tutorial to get ios and android projects merged:
http://gameit.ro/2011/08/creating-an-iphone-and-android-cocos2d-x-hybrid-project

And it worked fine.
Now I wanted to add lua support, so I did and it works fine for iOS, however I cannot do it for Android.
I’ve followed this description:

But it was made for earlier version of cocos and it doesn’t seem to work for me.
I’m getting this:

Compile++ thumb  : game_logic <= AppDelegate.cpp
In file included from jni/../../Classes/AppDelegate.cpp:1:
jni/../../Classes/AppDelegate.h:5:23: error: LuaEngine.h: No such file or directory
In file included from jni/../../Classes/AppDelegate.cpp:1:
jni/../../Classes/AppDelegate.h:43: error: ISO C++ forbids declaration of 'LuaEngine' with no type
jni/../../Classes/AppDelegate.h:43: error: expected ';' before '*' token
jni/../../Classes/AppDelegate.cpp: In constructor 'AppDelegate::AppDelegate()':
jni/../../Classes/AppDelegate.cpp:8: error: class 'AppDelegate' does not have any field named 'm_pLuaEngine'
jni/../../Classes/AppDelegate.cpp: In destructor 'virtual AppDelegate::~AppDelegate()':
jni/../../Classes/AppDelegate.cpp:15: error: 'm_pLuaEngine' was not declared in this scope
jni/../../Classes/AppDelegate.cpp:15: error: type '' argument given to 'delete', expected pointer
jni/../../Classes/AppDelegate.cpp: In member function 'virtual bool AppDelegate::applicationDidFinishLaunching()':
jni/../../Classes/AppDelegate.cpp:88: error: 'm_pLuaEngine' was not declared in this scope
jni/../../Classes/AppDelegate.cpp:88: error: expected type-specifier before 'LuaEngine'
jni/../../Classes/AppDelegate.cpp:88: error: expected ';' before 'LuaEngine'
make: *** [obj/local/armeabi/objs-debug/game_logic/AppDelegate.o] Error 1

Although I have:
$(LOCAL_PATH)/…/…/…/libs/lua/cocos2dx_support
defined in LOCAL_C_INCLUDES in my jni/Android.mk file.

Any tips?

Thanks

The path is error.
Did you copy cocos2dx/lua into libs?

<project_root>/libs/lua/cocos2dx_support/
its the correct path and LuaEngine.h is in there :confused:

Ahh this one is silved. I was missing these paths in /Classes/Android.mk file.
Now I’m getting this though:

SharedLibrary  : libgame_logic.so
./obj/local/armeabi/objs-debug/game_logic/AppDelegate.o: In function `LuaEngine':
/Users/krystian/ogsClient/android/jni/../../Classes/../libs/lua/cocos2dx_support/LuaEngine.h:31: undefined reference to `vtable for LuaEngine'
collect2: ld returned 1 exit status

It seems that you have pass through compiling phase, and have trouble in liking.
I think you should check that:

  1. Did liblua.so built successfully?
  2. Was link path correct?

Well I do have liblua.so built in my libs directory under android .
I am lost on everything else though.

I’ll paste my setup, hopefully it will be something stupid and easy to spot.

Here’s the directory structure:

 71M    ./android/assets
124K    ./android/bin
4.0K    ./android/gen
8.0K    ./android/jni/helloworld
 20K    ./android/jni
2.1M    ./android/libs/armeabi
2.1M    ./android/libs
 34M    ./android/obj/local/armeabi
 28K    ./android/res
 72K    ./android/src
108M    ./android
 16K    ./Classes
 20K    ./ios
8.0K    ./libs/cocos2dx/.settings
188K    ./libs/cocos2dx/actions
 36K    ./libs/cocos2dx/base_nodes
 48K    ./libs/cocos2dx/cocoa
 32K    ./libs/cocos2dx/effects
608K    ./libs/cocos2dx/include
 12K    ./libs/cocos2dx/keypad_dispatcher
 40K    ./libs/cocos2dx/label_nodes
 68K    ./libs/cocos2dx/layers_scenes_transitions_nodes
 40K    ./libs/cocos2dx/menu_nodes
 52K    ./libs/cocos2dx/misc_nodes
 72K    ./libs/cocos2dx/particle_nodes
 56K    ./libs/cocos2dx/platform/airplay
 96K    ./libs/cocos2dx/platform/android
292K    ./libs/cocos2dx/platform/bada
272K    ./libs/cocos2dx/platform/ios
 44K    ./libs/cocos2dx/platform/Linux
 80M    ./libs/cocos2dx/platform/third_party
 64K    ./libs/cocos2dx/platform/win32
 80K    ./libs/cocos2dx/platform/wophone
 82M    ./libs/cocos2dx/platform
4.0K    ./libs/cocos2dx/proj.airplay
116K    ./libs/cocos2dx/proj.bada/sdk1.0
 76K    ./libs/cocos2dx/proj.bada/sdk2.0
192K    ./libs/cocos2dx/proj.bada
124K    ./libs/cocos2dx/proj.linux
 76K    ./libs/cocos2dx/proj.win32
 76K    ./libs/cocos2dx/proj.wophone
4.0K    ./libs/cocos2dx/script_support
 76K    ./libs/cocos2dx/sprite_nodes
124K    ./libs/cocos2dx/support/data_support
 16K    ./libs/cocos2dx/support/image_support
116K    ./libs/cocos2dx/support/zip_support
312K    ./libs/cocos2dx/support
 24K    ./libs/cocos2dx/text_input_node
 72K    ./libs/cocos2dx/textures
 72K    ./libs/cocos2dx/tileMap_parallax_nodes
 24K    ./libs/cocos2dx/touch_dispatcher
 84M    ./libs/cocos2dx
 12M    ./libs/CocosDenshion
2.6M    ./libs/lua/cocos2dx_support
 32K    ./libs/lua/CocosDenshion_support
568K    ./libs/lua/lua
4.0K    ./libs/lua/proj.android/jni
4.0K    ./libs/lua/proj.android
 32K    ./libs/lua/proj.win32
 76K    ./libs/lua/tolua
3.3M    ./libs/lua
 72M    ./Resources

[I’ve trimmed a few to make it more readable]

Here’s my
android/jni/Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

subdirs := $(addprefix $(LOCAL_PATH)/../../libs/,$(addsuffix /Android.mk, \
           cocos2dx \
           CocosDenshion/android \
           lua/proj.android/jni \
        ))
subdirs += $(LOCAL_PATH)/../../Classes/Android.mk $(LOCAL_PATH)/helloworld/Android.mk

include $(subdirs)

android/jni/Application.mk

APP_STL := stlport_static
APP_MODULES := cocos2d cocosdenshion lua game_logic game

android/jni/helloworld/Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := game

LOCAL_SRC_FILES := main.cpp

LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../../libs/cocos2dx \
                    $(LOCAL_PATH)/../../../libs/cocos2dx/platform \
                    $(LOCAL_PATH)/../../../libs/cocos2dx/include \
                    $(LOCAL_PATH)/../../../libs/cocos2dx/lua_support \
                    $(LOCAL_PATH)/../../../Classes \
        $(LOCAL_PATH)/../../../libs/lua/lua \
        $(LOCAL_PATH)/../../../libs/lua/tolua \
        $(LOCAL_PATH)/../../../libs/lua/cocos2dx_support \
        $(LOCAL_PATH)/../../../libs/lua/CocosDenshion_support

LOCAL_LDLIBS := -L$(call host-path, $(LOCAL_PATH)/../../libs/$(TARGET_ARCH_ABI)) \
                -lcocos2d -llog -llua -lgame_logic

include $(BUILD_SHARED_LIBRARY)

Classes/Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := game_logic

LOCAL_SRC_FILES := AppDelegate.cpp

LOCAL_C_INCLUDES := $(LOCAL_PATH)/../libs/cocos2dx \
                    $(LOCAL_PATH)/../libs/cocos2dx/platform \
                    $(LOCAL_PATH)/../libs/cocos2dx/include \
        $(LOCAL_PATH)/../libs/cocos2dx/lua_support \
                    $(LOCAL_PATH)/../libs/CocosDenshion/include \
        $(LOCAL_PATH)/../Classes \
        $(LOCAL_PATH)/../libs/lua_support \
        $(LOCAL_PATH)/../libs/lua/lua \
        $(LOCAL_PATH)/../libs/lua/tolua \
        $(LOCAL_PATH)/../libs/lua/cocos2dx_support \
        $(LOCAL_PATH)/../libs/lua/CocosDenshion_support


LOCAL_LDLIBS := -L$(call host-path, $(LOCAL_PATH)/../android/libs/$(TARGET_ARCH_ABI)) \
                -lcocos2d -lcocosdenshion -llua \
                -L$(call host-path, $(LOCAL_PATH)/../libs/cocos2dx/platform/third_party/android/libraries/$(TARGET_ARCH_ABI)) -lcurl

include $(BUILD_SHARED_LIBRARY)

And that’s it.

The error I’m getting now is:

[...]
Compile thumb  : lua <= tolua_event.c
Compile thumb  : lua <= tolua_is.c
Compile thumb  : lua <= tolua_map.c
jni/../../libs/lua/proj.android/jni/../../tolua/tolua_map.c: In function 'tolua_usertype':
jni/../../libs/lua/proj.android/jni/../../tolua/tolua_map.c:398: warning: passing argument 2 of 'tolua_newmetatable' discards qualifiers from pointer target type
jni/../../libs/lua/proj.android/jni/../../tolua/tolua_map.c:28: note: expected 'char *' but argument is of type 'const char *'
Compile thumb  : lua <= tolua_push.c
Compile thumb  : lua <= tolua_to.c
SharedLibrary  : liblua.so
Install        : liblua.so => libs/armeabi/liblua.so
Compile++ thumb  : game_logic <= AppDelegate.cpp
SharedLibrary  : libgame_logic.so
./obj/local/armeabi/objs-debug/game_logic/AppDelegate.o: In function `LuaEngine':
/Users/krystian/ogsClient/android/jni/../../Classes/../libs/lua/cocos2dx_support/LuaEngine.h:31: undefined reference to `vtable for LuaEngine'
collect2: ld returned 1 exit status
make: *** [obj/local/armeabi/libgame_logic.so] Error 1

I think I find the error in Classes/Android.mk:

LOCAL_C_INCLUDES := $(LOCAL_PATH)/../libs/cocos2dx \
                    $(LOCAL_PATH)/../libs/cocos2dx/platform \
                    $(LOCAL_PATH)/../libs/cocos2dx/include \
        $(LOCAL_PATH)/../libs/cocos2dx/lua_support \
                    $(LOCAL_PATH)/../libs/CocosDenshion/include \
        $(LOCAL_PATH)/../Classes \
        $(LOCAL_PATH)/../libs/lua_support \
        $(LOCAL_PATH)/../libs/lua/lua \
        $(LOCAL_PATH)/../libs/lua/tolua \
        $(LOCAL_PATH)/../libs/lua/cocos2dx_support \
        $(LOCAL_PATH)/../libs/lua/CocosDenshion_support

Here, $(LOCAL_PATH) is the path of Class, I think you should change it to $(LOCAL_PATH)/…/android/libs/…

BTW: You can simplify android/jni/helloworld/Android.mk. It should only link libcocos2d.so and libgame_logic.so.
You can refer HelloLua/android/jni/helloworld/Android.mk for detail info.

Hi Minggo, thanks for reply.
I am not sure, however, what do you mean :confused:

I’ve tried changing LOCAL_PATH to:
LOCAL_PATH := $(call my-dir)
LOCAL_PATH := $(LOCAL_PATH)/…/android/libs/…

But then it would throw:

Gdbserver      : [arm-linux-androideabi-4.4.3] libs/armeabi/gdbserver
Gdbsetup       : libs/armeabi/gdb.setup
Install        : libcocos2d.so => libs/armeabi/libcocos2d.so
Install        : libcocosdenshion.so => libs/armeabi/libcocosdenshion.so
Install        : liblua.so => libs/armeabi/liblua.so
make: *** No rule to make target `jni/../../Classes/../android/libs/.../AppDelegate.cpp', needed by `obj/local/armeabi/objs-debug/game_logic/AppDelegate.o'.  Stop.

I also tried changing all the paths in LOCAL_C_INCLUDES to:

LOCAL_C_INCLUDES := $(LOCAL_PATH)/../android/libs/../../libs/cocos2dx \
                    $(LOCAL_PATH)/../android/libs/../../libs/cocos2dx/platform \
                    $(LOCAL_PATH)/../android/libs/../../libs/cocos2dx/include \
        $(LOCAL_PATH)/../android/libs/../../libs/cocos2dx/lua_support \
                    $(LOCAL_PATH)/../android/libs/../../libs/CocosDenshion/include \
        $(LOCAL_PATH)/../android/libs/../../Classes \
        $(LOCAL_PATH)/../android/libs/../../libs/lua_support \
        $(LOCAL_PATH)/../android/libs/../../libs/lua/lua \
        $(LOCAL_PATH)/../android/libs/../../libs/lua/tolua \
        $(LOCAL_PATH)/../android/libs/../../libs/lua/cocos2dx_support \
        $(LOCAL_PATH)/../android/libs/../../libs/lua/CocosDenshion_support

but since it does point to the exact same place it throws the same error as before:

Gdbserver      : [arm-linux-androideabi-4.4.3] libs/armeabi/gdbserver
Gdbsetup       : libs/armeabi/gdb.setup
Install        : libcocos2d.so => libs/armeabi/libcocos2d.so
Install        : libcocosdenshion.so => libs/armeabi/libcocosdenshion.so
Install        : liblua.so => libs/armeabi/liblua.so
Compile++ thumb  : game_logic <= AppDelegate.cpp
SharedLibrary  : libgame_logic.so
./obj/local/armeabi/objs-debug/game_logic/AppDelegate.o: In function `LuaEngine':
/Users/krystian/ogsClient/android/jni/../../Classes/../android/libs/../../libs/lua/cocos2dx_support/LuaEngine.h:31: undefined reference to `vtable for LuaEngine'
collect2: ld returned 1 exit status

uhhhh

just for future reference…
instead of fiddling with some old howtos and tutorials just copy the Android.mk and Application.mk files from HelloLua directory to your project and adjust the paths.
I was missing all the lua *.cpp files in LOCAL_SRC_FILES