首先把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
在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)
该变量指向一个已编译好的共享库。与BUILD_SHARED_LIBRARY和BUILD_STATIC_LIBRARY不同,此时相应的LOCAL_SRC_FILES不再指定源文件,而是指向这个预编译共享库文件(例如 foo/libfoo.so)。可以在其他模块中,通过使用LOCAL_PREBUILTS变量来引用这个预编译模块。
与PREBUILT_SHARED_LIBRARY相同,只不过这里是静态库。
参考:1:http://blog.csdn.net/smfwuxiao/article/details/8530742
2:http://blog.csdn.net/crazyman2010/article/details/40401545