cocos2d android分析之-libcocos2dlua.so库

首先把so动态库文件 编译出来(通过NDK),然后再 拷贝到android的工程里 libs/armeabi/下,如果libs/armeabi 不存在,那就自己创建,最后用eclipse编译项目,这样将自动把so文件打包到apk里;eclipse在打包的时候会根据文件名的命名规则(lib****.so)去打包so文件,开头和结尾必须分别为“lib”和“.so”,否则是不会打包到apk文件中的。

生成so文件的规则参考Android.mk文件:


LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)  清除变量

LOCAL_MODULE := cocos2dlua_shared  定义模块名

LOCAL_MODULE_FILENAME := libcocos2dlua  输出的文件名字,所以会生成libcocos2dlua.so文件

LOCAL_SRC_FILES := \
../../Classes/AppDelegate.cpp \   需要编译的源文件

hellolua/main.cpp

LOCAL_C_INCLUDES := \
$(LOCAL_PATH)/../../Classes/protobuf-lite \
$(LOCAL_PATH)/../../Classes/runtime \
$(LOCAL_PATH)/../../Classes \
$(LOCAL_PATH)/../../../cocos2d-x/external \
$(LOCAL_PATH)/../../../cocos2d-x/tools/simulator/libsimulator/lib  

LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes   <span style="font-family: 'Microsoft YaHei', 微软雅黑, Lucida, Verdana, 'Hiragino Sans GB', STHeiti, 'WenQuanYi Micro Hei', SimSun, sans-serif;">c文件的搜索路径</span>


# _COCOS_HEADER_ANDROID_BEGIN
# _COCOS_HEADER_ANDROID_END

LOCAL_STATIC_LIBRARIES := cocos2d_lua_static
LOCAL_STATIC_LIBRARIES += cocos2d_simulator_static  依赖这两个静态库

# _COCOS_LIB_ANDROID_BEGIN
# _COCOS_LIB_ANDROID_END

include $(BUILD_SHARED_LIBRARY)  生成 动态链接库 so 文件

$(call import-module,scripting/lua-bindings/proj.android)  指定静态库的搜索路径
$(call import-module,tools/simulator/libsimulator/proj.android)

# _COCOS_LIB_IMPORT_ANDROID_BEGIN
# _COCOS_LIB_IMPORT_ANDROID_END

是否所有的c文件都编译进来了呢?答案是肯定的。其他c文件编译进了其他静态链接库中,层层依赖,但最终都到了.so这个文件中了。


在cocos2d android代码中对这个so进行了加载以便可以调用C++。

Cocos2dxActivity:

protected void onLoadNativeLibraries() {
        try {
            ApplicationInfo ai = getPackageManager().getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);
            Bundle bundle = ai.metaData;
            String libName = bundle.getString("android.app.lib_name");
            System.loadLibrary(libName);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
经过一段时间的追寻,静态库依赖关系是这样的:

cocos2dlua_shared-[cocos2d_lua_static,cocos2d_simulator_static]

cocos2d_lua_static-[cocos2d_lua_android_static,cocos2dx_static,pbc,dragonbones_static],pbc,dragonbones_static是自己添加进来的。

cocos2dx_static-[cocosbuilder_static,cocos3d_static,spine_static...lib_socket_static]

cocos2dx_internal_static这个包含了很多基本的类,但是它嵌入的还是蛮深的。

cocos2dx_internal_static--->cocos_extension_static--->cocos_ui_static--->cocostudio_static。

其实没必要这么较真的,反正都是各种依赖,但是找到了总算验证了我们的答案,心里踏实多了。

如何加入已经编译好的静态库呢,这些库就不需要我们去编译了。

分析cocos2d中集成的curl库吧。

文件结构为:

curl

  --include 包含了所有的头文件

  --prebuilt 包含了所有平台的静态库

     --android 又是各种cpu类型

         ---armeabi  

         ---armeabi-v7a

         ---x86

 --- Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := cocos_curl_static  库名
LOCAL_MODULE_FILENAME := curl
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libcurl.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../../include/android
LOCAL_STATIC_LIBRARIES += cocos_ssl_static 依赖的静态库
LOCAL_STATIC_LIBRARIES += cocos_crypto_static
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE := cocos_crypto_static
LOCAL_MODULE_FILENAME := crypto
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libcrypto.a
include $(PREBUILT_STATIC_LIBRARY)

LOCAL_MODULE := cocos_ssl_static
LOCAL_MODULE_FILENAME := ssl
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libssl.a
include $(PREBUILT_STATIC_LIBRARY)  


PREBUILT_SHARED_LIBRARY

该变量指向一个已编译好的共享库。与BUILD_SHARED_LIBRARY和BUILD_STATIC_LIBRARY不同,此时相应的LOCAL_SRC_FILES不再指定源文件,而是指向这个预编译共享库文件(例如 foo/libfoo.so)。可以在其他模块中,通过使用LOCAL_PREBUILTS变量来引用这个预编译模块。

PREBUILT_STATIC_LIBRARY

与PREBUILT_SHARED_LIBRARY相同,只不过这里是静态库。 

参考:

1:http://blog.csdn.net/smfwuxiao/article/details/8530742

2:http://blog.csdn.net/crazyman2010/article/details/40401545

3:http://www.cnblogs.com/rainduck/p/3600472.html
4:

  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Cocos2d是一种流行的2D游戏引擎,它支持多平台开发,包括iOS、Android、Windows、Mac OS X等。Cocos2d-python是Cocos2d-x游戏引擎的Python版本,它提供了许多强大的功能,如游戏场景、动画、精灵、物理引擎等,非常适合开发2D游戏。 下面是一个简单的Cocos2d-python的helloworld程序: 1. 安装Cocos2d-python 在安装Cocos2d-python之前,需要先安装Python和pip。然后使用pip命令安装Cocos2d-python: ``` pip install cocos2d ``` 2. 创建一个新的Cocos2d-python项目 打开命令行窗口,进入到要创建项目的目录,然后执行以下命令: ``` cocos new mygame -p com.mycompany.mygame -l python ``` 其中,mygame是项目名称,com.mycompany.mygame是包名。 3. 编写helloworld程序 在mygame项目的src目录下创建一个新的Python文件helloworld.py,然后输入以下代码: ```python import cocos class HelloWorld(cocos.layer.Layer): def __init__(self): super(HelloWorld, self).__init__() label = cocos.text.Label( 'Hello, world!', font_name='Times New Roman', font_size=32, anchor_x='center', anchor_y='center' ) label.position = 320, 240 self.add(label) if __name__ == '__main__': cocos.director.director.init() HelloWorldScene = cocos.scene.Scene(HelloWorld()) cocos.director.director.run(HelloWorldScene) ``` 这个程序创建了一个名为HelloWorld的Layer,该Layer包含一个居中显示的文本标签“Hello, world!”。最后,它创建了一个Scene,将HelloWorld添加到Scene中,并运行Scene。 4. 运行helloworld程序 在命令行窗口中进入mygame项目的根目录,然后执行以下命令: ``` python src/helloworld.py ``` 程序将会启动,并显示一个居中显示的“Hello, world!”文本标签。 这是一个简单的Cocos2d-python的helloworld程序,你可以在此基础上进一步学习Cocos2d-python的开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值