zoukankan      html  css  js  c++  java
  • 编译类【COCOS2DXLUA 脚本开发之十四】解决自定义CPP类通过TOLUA++ BINDING LUACOCOS2D后编译到ANDROID运行黑屏(没有调用自定义CPP类)的问题!

    最近应用发开的程过中涌现了一个小问题,顺便记录一下原因和方法--编译类

        

        本站文章均为 李华明Himi 原创,载转务必在显明处注明:(作者新浪微博: @李华明Himi 
    载转自【黑米GameDev街区】 原文接链: http://www.himigame.com/lua-game/1388.html
     

    ☞ 点击阅订 ☜
     本博客最新态动!实时将最新博文知通您!

        

        

        

        

     

        

     

        

        唉,首先说点闲话 – -。Himi搞了不短的时光,这个问题始终没有决解,最后于终在张大(cocos2dx擎引发开者之一 张小明)的指导下决解了此问题。

        本章基于上一篇  【COCOS2DX-LUA 脚本发开之十三】  与之前的项目整合 【Cocos2d-X(2.x) 游戏发开系列之二】cocos2dx最新2.x版本跨平台整合NDK+Xcode,Xcode编写&编译代码,Android入导打包行运便可!

        在进入正文之前,解讲下一些基本知识:(以后Himi的版本是cocos2xx 2.1.2 hotfix)

        第一部份:

        编译过项目到Android的童鞋们定肯道知建创好的Android项面前目今的jni下的Android.mk 这个件文,如下:

        

    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
    LOCAL_PATH := $(call my-dir)
     
    include $(CLEAR_VARS)
     
    LOCAL_MODULE := game_shared
     
    LOCAL_MODULE_FILENAME := libgame
     
    LOCAL_SRC_FILES := hellocpp/main.cpp \
                       http://www.cnblogs.com/Classes/AppDelegate.cpp
     
    LOCAL_C_INCLUDES := $(LOCAL_PATH)/http://www.cnblogs.com/Classes
     
    LOCAL_STATIC_LIBRARIES := curl_static_prebuilt                
     
    LOCAL_WHOLE_STATIC_LIBRARIES := cocos2dx_static
    LOCAL_WHOLE_STATIC_LIBRARIES += cocosdenshion_static
    LOCAL_WHOLE_STATIC_LIBRARIES += cocos_lua_static
    LOCAL_WHOLE_STATIC_LIBRARIES += cocos_extension_static
     
    include $(BUILD_SHARED_LIBRARY)
     
    $(call import-module,cocos2dx)
    $(call import-module,CocosDenshion/android)
    $(call import-module,scripting/lua/proj.android/jni)
    $(call import-module,cocos2dx/platform/third_party/android/prebuilt/libcurl)
    $(call import-module,extensions)

        这个件文中,要主我们存眷如下几个配置:‘

        1.  LOCAL_SRC_FILES  :  编译到Android的地本的类cpp或c,比如自定义了一个类HSprite.h  HSprite.cpp

        那么要需添加到这个 LOCAL_SRC_FILES 中,如下:

        

    1
    2
    3
    LOCAL_SRC_FILES := hellocpp/main.cpp \
                       http://www.cnblogs.com/Classes/AppDelegate.cpp \
                       http://www.cnblogs.com/Classes/HSprite.cpp

         

        2. LOCAL_C_INCLUDES  :编译的地本类地点的路径,例如你有一个HSprite类放在Himi的件文夹中,那么你可以如下式形添加:

        

    1
    2
    3
    4
    5
    6
    7
    8
    LOCAL_C_INCLUDES := $(LOCAL_PATH)/http://www.cnblogs.com/Classes \
                        $(LOCAL_PATH)/http://www.cnblogs.com/Classes/Himi
     
    那么在你其他的类停止引用Himi件文夹下的HSprite时,无需写完整路径,如下:
    #include "Himi/HSprite.h"
     
    可以直接如下入导:
    #include "HSprite.h"

        3.     LOCAL_STATIC_LIBRARIES  : 添加所要需接链的静态库

         

        本章要需存眷的是如下的配置:

        4.    call import-module    :   编译对应的模块!

               $(call import-module,cocos2dx)  :体具是从 NDK_MODULE_PATH 路径下的cocos2dx件文夹下的Android.mk

         

        那么 NDK_MODULE_PATH 是指向哪里呢?哪里设置呢?上面体具解讲!

         

        第二部份:

        编译过项目到Android的童鞋们定肯也道知build_native.sh 这个件文,NDK_MODULE_PATH的路径也在此件文中停止设置, 如下图:

        如下:

        

    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
    APPNAME="Tuc4Android"
     
    # options
     
    buildexternalsfromsource=
     
    usage(){
    cat << EOF
    usage: $0 [options]
     
    Build C/C++ code for $APPNAME using Android NDK
     
    OPTIONS:
    -s  Build externals from source
    -h  this help
    EOF
    }
     
    while getopts "sh" OPTION; do
    case "$OPTION" in
    s)
    buildexternalsfromsource=1
    ;;
    h)
    usage
    exit 0
    ;;
    esac
    done
     
    # paths
     
    if [ -z "${NDK_ROOT+aaa}" ];then
    echo "please define NDK_ROOT"
    exit 1
    fi
     
    DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
    # ... use paths relative to current directory
    COCOS2DX_ROOT="/Users/slater/Documents/cocos2d-2.1rc0-x-2.1.2-hotfix"
    APP_ROOT="/Users/slater/Desktop/TestUserCpp/TestUserCpp"
    APP_ANDROID_ROOT="/Users/slater/Desktop/TestUserCpp/TestUserCpp/proj.android"
     
    echo "NDK_ROOT = $NDK_ROOT"
    echo "COCOS2DX_ROOT = $COCOS2DX_ROOT"
    echo "APP_ROOT = $APP_ROOT"
    echo "APP_ANDROID_ROOT = $APP_ANDROID_ROOT"
     
    # make sure assets is exist
    if [ -d "$APP_ANDROID_ROOT"/assets ]; then
        rm -rf "$APP_ANDROID_ROOT"/assets
    fi
     
    mkdir "$APP_ANDROID_ROOT"/assets
     
    # copy resources
    for file in "$APP_ROOT"/Resources/*
    do
    if [ -d "$file" ]; then
        cp -rf "$file" "$APP_ANDROID_ROOT"/assets
    fi
     
    if [ -f "$file" ]; then
        cp "$file" "$APP_ANDROID_ROOT"/assets
    fi
    done
     
    # copy icons (if they exist)
    file="$APP_ANDROID_ROOT"/assets/Icon-72.png
    if [ -f "$file" ]; then
        cp "$file" "$APP_ANDROID_ROOT"/res/drawable-hdpi/icon.png
    fi
    file="$APP_ANDROID_ROOT"/assets/Icon-48.png
    if [ -f "$file" ]; then
        cp "$file" "$APP_ANDROID_ROOT"/res/drawable-mdpi/icon.png
    fi
    file="$APP_ANDROID_ROOT"/assets/Icon-32.png
    if [ -f "$file" ]; then
        cp "$file" "$APP_ANDROID_ROOT"/res/drawable-ldpi/icon.png
    fi
     
    if [[ "$buildexternalsfromsource" ]]; then
        echo "Building external dependencies from source"
        "$NDK_ROOT"/ndk-build -C "$APP_ANDROID_ROOT" $* \
            "NDK_MODULE_PATH=${COCOS2DX_ROOT}:${COCOS2DX_ROOT}/cocos2dx/platform/third_party/android/source"
    else
        echo "Using prebuilt externals"
        "$NDK_ROOT"/ndk-build -C "$APP_ANDROID_ROOT" $* \
            "NDK_MODULE_PATH=${COCOS2DX_ROOT}:${COCOS2DX_ROOT}/cocos2dx/platform/third_party/android/prebuilt"
    fi
        每日一道理
    书,各种各样的书。书,寄托着人类热切的希望;书,蕴含着人类丰富的感悟。提起书,会有说不完的话语……

        在之前我们整合项目编译到Android时其中我们要需存眷的是 COCOS2DX_ROOT、 APP_ROOT、 APP_ANDROID_ROOT这三个路径的设置。

        那么本次我们存眷的是最下方  NDK_MODULE_PATH  是用于配置索搜编译模块的基本路径! 此路径与第一部份的Android.mk中 call import-module  关相!

        ${COCOS2DX_ROOT}:${COCOS2DX_ROOT}/cocos2dx/platform/third_party/android/prebuilt”

        示表两个路径,一个是COCOS2DX_ROOT的路径,另外一个是COCOS2DX_ROOT路径下的/cocos2dx/platform/third_party/android/prebuilt

         

        通过如上两个知识点的单简的绍介,大家可能会对编译程过更深一步的懂得。

        在现开始解讲本章重点:  决解自定义cpp类通过tolua++ binding LuaCocos2d后编译到Android行运黑屏(没有调用自定义cpp类)的问题!

        如果大家没有自定义类binding到LuaCocos2d中那么编译Android绝对是准确行运的,但是难免会自定义一些类供lua脚本应用,一般我们可以通过tolua++停止binding到LuaCocos2d中(参考Himi的另外一篇文章:【COCOS2DX-LUA 脚本发开之四】应用tolua++编译pkg,从而建创自定义类让Lua脚本应用

        当准确binding到LuaCocos2d后,我们iphone模拟器行运后一切正常,那么当编译到Android后,老是涌现黑屏,并屏幕显示有0个精灵 !

        错误出在哪里呢?!首先我们最易容想到的是检查看 Android项面前目今jni下的Android.mk中的LOCAL_SRC_FILES 是不是包含了你自定义的类!定肯是不是与参编译了!

        如果定肯与参编译了,并Android项目能正常行运,但是还是行运黑屏的话,那么你可以印打lua中调用的自定义类!最后会现发印打语句编译到Android后,本根没印打!基本上那就可以判定是LuaCocos2d这个类中并没有binding你自定义类!

        有些童鞋就怪奇说可以定肯xcode项面前目今的LuaCocos2d类中确切binding了自定义类啊!!

        是的,但是你看到的只是ios项目所用的LuaCocos2d, 真正编译到Android后的LuaCocos2d本根不是ios项面前目今的LuaCocos2d这个类!!

        那么究竟是哪里的LuaCocos2d被编译到Android了呢?其实不难现发,通过Android.mk中看到编译lua模块的语句:

        $(call import-module,scripting/lua/proj.android/jni)   : 我们可以道知它指向cocos2dx擎引下的scripting/lua/proj.android/jni/Android.mk

        路径如下:

        QQ20130427-1

         

        开打后内容如下:

        

    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
    LOCAL_PATH := $(call my-dir)
    include $(CLEAR_VARS)
     
    LOCAL_MODULE    := cocos_lua_static
     
    LOCAL_MODULE_FILENAME := liblua
     
    LOCAL_SRC_FILES :=http://www.cnblogs.com/lua/lapi.c \
                      http://www.cnblogs.com/lua/lauxlib.c \
              http://www.cnblogs.com/lua/lbaselib.c \
              http://www.cnblogs.com/lua/lcode.c \
              http://www.cnblogs.com/lua/ldblib.c \
              http://www.cnblogs.com/lua/ldebug.c \
              http://www.cnblogs.com/lua/ldo.c \
              http://www.cnblogs.com/lua/ldump.c \
              http://www.cnblogs.com/lua/lfunc.c \
              http://www.cnblogs.com/lua/lgc.c \
              http://www.cnblogs.com/lua/linit.c \
              http://www.cnblogs.com/lua/liolib.c \
              http://www.cnblogs.com/lua/llex.c \
              http://www.cnblogs.com/lua/lmathlib.c \
              http://www.cnblogs.com/lua/lmem.c \
              http://www.cnblogs.com/lua/loadlib.c \
              http://www.cnblogs.com/lua/lobject.c \
              http://www.cnblogs.com/lua/lopcodes.c \
              http://www.cnblogs.com/lua/loslib.c \
              http://www.cnblogs.com/lua/lparser.c \
              http://www.cnblogs.com/lua/lstate.c \
              http://www.cnblogs.com/lua/lstring.c \
              http://www.cnblogs.com/lua/lstrlib.c \
              http://www.cnblogs.com/lua/ltable.c \
              http://www.cnblogs.com/lua/ltablib.c \
              http://www.cnblogs.com/lua/ltm.c \
              http://www.cnblogs.com/lua/lua.c \
              http://www.cnblogs.com/lua/lundump.c \
              http://www.cnblogs.com/lua/lvm.c \
              http://www.cnblogs.com/lua/lzio.c \
              http://www.cnblogs.com/lua/print.c \
              http://www.cnblogs.com/tolua/tolua_event.c \
              http://www.cnblogs.com/tolua/tolua_is.c \
              http://www.cnblogs.com/tolua/tolua_map.c \
              http://www.cnblogs.com/tolua/tolua_push.c \
              http://www.cnblogs.com/tolua/tolua_to.c \
              http://www.cnblogs.com/cocos2dx_support/CCLuaBridge.cpp \
              http://www.cnblogs.com/cocos2dx_support/CCLuaEngine.cpp \
              http://www.cnblogs.com/cocos2dx_support/CCLuaStack.cpp \
              http://www.cnblogs.com/cocos2dx_support/CCLuaValue.cpp \
              http://www.cnblogs.com/cocos2dx_support/Cocos2dxLuaLoader.cpp \
              http://www.cnblogs.com/cocos2dx_support/LuaCocos2d.cpp \
              http://www.cnblogs.com/cocos2dx_support/tolua_fix.c
     
    LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/http://www.cnblogs.com/lua \
                               $(LOCAL_PATH)/http://www.cnblogs.com/tolua \
                               $(LOCAL_PATH)/http://www.cnblogs.com/cocos2dx_support
     
    LOCAL_C_INCLUDES := $(LOCAL_PATH)/ \
                        $(LOCAL_PATH)/http://www.cnblogs.com/lua \
                        $(LOCAL_PATH)/http://www.cnblogs.com/tolua \
                        $(LOCAL_PATH)/http://www.cnblogs.com/http://www.cnblogs.com/cocos2dx \
                        $(LOCAL_PATH)/http://www.cnblogs.com/http://www.cnblogs.com/cocos2dx/include \
                        $(LOCAL_PATH)/http://www.cnblogs.com/http://www.cnblogs.com/cocos2dx/platform \
                        $(LOCAL_PATH)/http://www.cnblogs.com/http://www.cnblogs.com/cocos2dx/platform/android \
                        $(LOCAL_PATH)/http://www.cnblogs.com/http://www.cnblogs.com/cocos2dx/kazmath/include \
                        $(LOCAL_PATH)/http://www.cnblogs.com/http://www.cnblogs.com/CocosDenshion/include
     
    LOCAL_CFLAGS += -Wno-psabi
    LOCAL_EXPORT_CFLAGS += -Wno-psabi
     
    include $(BUILD_STATIC_LIBRARY)

        从这个mk件文的内容中我们可以看到与参编译的LuaCocos2d类是于对相以后Android.mk 路径的  http://www.cnblogs.com/cocos2dx_support/LuaCocos2d.cpp \

        从上面的附上的图可以清晰的看到这个路径,是以后Android.mk的路径的上两层后的目录下的cocos2dx_support的LuaCocos2d.cpp件文!

        可能讲到这里,很多童鞋应当如梦初醒了吧!

        虽然我们自定义类通过tolua++ binding到项面前目今的LuaCococs2d 中,但是与参Android编译的LuaCocos2d并非你项面前目今的!

              OK,那上面给出几种决解式方:

              第一种:将我们项面前目今的已binding好的LuaCococs2d类换替与参编译的LuaCococs2d类!

                             (注:LuaCococs2d.h中入导的自定义类路径,引用你项面前目今的对应类便可)

             

            第二种: 将编译的Lua模块的Android.mk中的与参编译的LuaCococs2d路径改成自己项面前目今的LuaCococs2d路径便可。

            

            第三种: 通过修改 NDK_MODULE_PATH 路径,将其指向我们项面前目今的libs路径,然后将与参编译的少缺模块copy到我们的项面前目今对应路径便可!

        这个问题其实较比易容决解,但是要主的是懂得道理!否则会越忙越乱!

    文章结束给大家分享下程序员的一些笑话语录: AdobeFlash拖垮Windows拖垮IE!又拖垮Linux拖垮Ubuntu拖垮FirxEox!还拖垮BSD拖垮MacOS拖垮Safri!简直无所不拖!AdobeFlash滚出网路世界!不要以为市占有率高就可以持续出烂货产品!以后替代品多得是!

  • 相关阅读:
    【总结】进程和线程的区别
    为什么要求数据链路层帧的长度必须限制在一定范围内?
    常用正交表
    用正交表设计测试用例
    测试中的杀虫剂困境
    作品集-1:淘宝支付宝登陆框
    # 36氪开放日 • 杭州 • 11月10日 # 谈谈参会感受
    《在你身边,为你设计》读后感
    抱怨的背后
    更快的方式实现PHP数组去重
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3047770.html
Copyright © 2011-2022 走看看