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',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) |