eclipse在编译的时候,会主动删除我们拷贝在libs下的so库
如何引入第三方so库: http://bbs.csdn.net/topics/390397961
如何编译多个so库: http://www.jb51.cc/article/p-zteaamdj-kg.html
参考了以上回答,给出我具体的解决步骤:
我们先看一下我的Android.mk:
LOCAL_PATH:=$(callmy-dir) #模块开头include$(CLEAR_VARS)模块结束include$(BUILD_XXX) #模块1 include$(CLEAR_VARS)#清除LOCAL_PATH以外的所有LOCAL_XXX变量 LOCAL_MODULE:=libsmsprotocol LOCAL_SRC_FILES:= prebuilt/$(TARGET_ARCH_ABI)/libsmsprotocol.so include$(PREBUILT_SHARED_LIBRARY) #模块2 include$(CLEAR_VARS)#清除LOCAL_PATH以外的所有LOCAL_XXX变量 LOCAL_MODULE:=libmegjb LOCAL_SRC_FILES:= prebuilt/$(TARGET_ARCH_ABI)/libmegjb.so include$(PREBUILT_SHARED_LIBRARY) #模块3 include$(CLEAR_VARS) $(callimport-add-path,$(LOCAL_PATH)/../../cocos2d) $(callimport-add-path,$(LOCAL_PATH)/../../cocos2d/external) $(callimport-add-path,$(LOCAL_PATH)/../../cocos2d/cocos) $(callimport-add-path,$(LOCAL_PATH)/../../cocos2d/iconv) LOCAL_MODULE:=cocos2dcpp_shared LOCAL_MODULE_FILENAME:=libcocos2dcpp #配置自己的源文件目录和源文件后缀名 MY_FILES_PATH:=$(LOCAL_PATH)\ $(LOCAL_PATH)/../../Classes MY_FILES_SUFFIX:=%.cpp%.c #递归遍历目录下的所有的文件 rwildcard=$(wildcard$1$2)$(foreachd,$(wildcard$1*),$(callrwildcard,$d/,$2)) #获取相应的源文件 MY_ALL_FILES:=$(foreachsrc_path,$(MY_FILES_PATH),$(src_path),*.*)) MY_ALL_FILES:=$(MY_ALL_FILES:$(MY_CPP_PATH)/./%=$(MY_CPP_PATH)%) MY_SRC_LIST:=$(filter$(MY_FILES_SUFFIX),$(MY_ALL_FILES)) MY_SRC_LIST:=$(MY_SRC_LIST:$(LOCAL_PATH)/%=%) #去除字串的重复单词 defineuniq= $(evalseen:=) $(foreach_,$1,$(if$(filter$_,${seen}),$(evalseen+=$_))) ${seen} endef #递归遍历获取所有目录 MY_ALL_DIRS:=$(dir$(foreachsrc_path,*/))) MY_ALL_DIRS:=$(calluniq,$(MY_ALL_DIRS)) #赋值给NDK编译系统 LOCAL_SRC_FILES:= $(MY_SRC_LIST) LOCAL_C_INCLUDES:=$(MY_ALL_DIRS)\ LOCAL_C_INCLUDES:=$(LOCAL_PATH)/Classes LOCAL_WHOLE_STATIC_LIBRARIES:=cocos2dx_static LOCAL_WHOLE_STATIC_LIBRARIES+=cocosdenshion_static #LOCAL_WHOLE_STATIC_LIBRARIES+=libiconv #LOCAL_WHOLE_STATIC_LIBRARIES+=Box2d_static #LOCAL_WHOLE_STATIC_LIBRARIES+=cocosbuilder_static #LOCAL_WHOLE_STATIC_LIBRARIES+=spine_static #LOCAL_WHOLE_STATIC_LIBRARIES+=cocostudio_static #LOCAL_WHOLE_STATIC_LIBRARIES+=cocos_network_static #LOCAL_WHOLE_STATIC_LIBRARIES+=cocos_extension_static include$(BUILD_SHARED_LIBRARY) #include$(BUILD_STATIC_LIBRARY)表示编译成静态库 #include$(BUILD_SHARED_LIBRARY)表示编译成动态库。 #include$(BUILD_EXECUTABLE)表示编译成可执行程序 $(callimport-module,.) $(callimport-module,audio/android) #$(callimport-module,iconv) #$(callimport-module,Box2D) #$(callimport-module,editor-support/cocosbuilder) #$(callimport-module,editor-support/spine) #$(callimport-module,editor-support/cocostudio) #$(callimport-module,network) #$(callimport-module,extensions)
如果通读完上边的网址,可以发现,其实cocos2dx也是作为一个模块来编译的,既然如此,那么我们就把第三方的so库,也作为模块使用 ,使用的MK写法为:
include$(CLEAR_VARS)#清除LOCAL_PATH以外的所有LOCAL_XXX变量,模块开始 LOCAL_MODULE:=libsmsprotocol#模块的名字,可随意 #so库相对于Android.mk文件所在目录的路径,$(TARGET_ARCH_ABI)会智能的选择当前平台,指定多平台,可修改Application.mk LOCAL_SRC_FILES:= prebuilt/$(TARGET_ARCH_ABI)/libsmsprotocol.so include$(PREBUILT_SHARED_LIBRARY)#模块结束
这样,一个模块就好了,如果多个模块,依次类推,所以可以猜到,cocos2dx,也是其中的一个模块,为什么,因为当我尝试着这么写的时候,出现了这个错误:
错误的写法: include$(CLEAR_VARS) LOCAL_MODULE:=libmegjb LOCAL_SRC_FILES:= prebuilt/$(TARGET_ARCH_ABI)/a.so LOCAL_SRC_FILES+= prebuilt/$(TARGET_ARCH_ABI)/b.so include$(PREBUILT_SHARED_LIBRARY) 错误log: 23:12:34****IncrementalBuildofconfigurationReleaseforprojectfish**** pythonE:/project/fish/branchHeGameOld/proj.android/build_native.py-breleaseall E:/android/android-ndk-r9d/build/core/prebuilt-library.mk:28:***missingseparator. Stop. AndroidNDK:ERROR:jni/Android.mk:smsprotocol:    Traceback(mostrecentcalllast): make.exe:Enteringdirectory`E:/project/fish/branchHeGameOld/proj.android'
分析:很熟悉的错误,是mk写法有问题,好像是分隔符的问题,是不是TAB或者空格的数量不对,插到最后,发现不是这里的原因,其实答案在红字已经给出来了,所以我大胆推测,cocos2dx也是其中的一个模块,再结合之前的文章更是印证了这个猜测。好了,编译完美通过,有什么问题,大家可以留言,至于这个mk文件,大家可以留着,毕竟经过了项目检验,问题少。