现在的位置: 首页 > 综合 > 正文

cocos2dx android ndk 加载动态库(.so)

2014年09月05日 ⁄ 综合 ⁄ 共 1539字 ⁄ 字号 评论关闭

当项目开发到一定阶段,基本上需要接入第三方sdk的了,ios上还比较好办,就不说了。android上步骤是比较繁琐的。

通常sdk会叫你把动态库文件扔到项目的libs中,但Cocos2dx在编译时会把libs目录下的东西清空,然后从其他地方引入的,所以不能直接放进去。

关于prebuilt,有一个地方先留意参考一下,cocos2dx本身会引入一些静态库(.a),例如curl之类的,可以在cocos2dx/platform/third_party/android/prebuilt目录下找到。那这些静态库是如何加载进去的呢,可以在项目中的proj.android/jni/Android.mk中找到答案。

这里先不说加载静态库,因为比较简单。

好了~~开始了



好了,开始介绍如何引入,方法有两种
例如要加载一个静态库文件 libdynamic1.so

方法1:
把libdynamic1.so放到proj.android/jni/下

编辑 proj.android/jni/Android.mk
在最末尾加入
#----
include $(CLEAR_VARS)
LOCAL_MODULE     := entry
LOCAL_SRC_FILES := libdynamic1.so
include $(BUILD_SHARED_LIBRARY)
#----
保存退出,然后运行build_native.sh,就会发现多了Install lib dynamic1.so的输出了。
如果要加入多个动态库,就参考上面所说的,在proj.anroid/jni/下建立多个文件夹,然后在Android.mk上继续增加上面的语句就行。

方法2:
proj.android/jni/下新建一个libdynamic1的文件夹,里面新建一个Android.mk,
然后在libdynamic1文件夹下再建一个armeabi文件夹,这个是关于编译的CPU类型的,在其里面放进libdynamic1.so
整体结构就是
libdynamic1/Android.mk
libdynamic1/armeabi/libdynamic1.so
Android.mk的内容为:
#---
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE     := dynamic1
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libdynamic1.so
include $(PREBUILT_SHARED_LIBRARY)
#---

这里涉及到NDK_MODULE_PATH,其实就是调用call import-module的搜索路径,可以在proj.android/build_native.sh中查到它的定义。
跟方法1不同,这次在Android.mk加入的语句为

include $(BUILD_SHARED_LIBRARY)
前加入
LOCAL _SHARED_LIBRARIES := dynamic1
如果加入多个,即为
LOCAL _SHARED_LIBRARIES := dynamic1 dynamic2 dynamic3
然后在文件末尾,加入
$(call import-module,projects/项目名/proj.android/jni/libdynamic1)
加入多个的话雷同。

到这里为止,已经成功将动态库引入进来了,然后就是加载,
在主java里找到
static {
     System.loadLibrary("cocos2dlua");
}
加入自己要加载的东西就可以了
static {
     System.loadLibrary("dynamic1");
     System.loadLibrary("cocos2dlua");

}

抱歉!评论已关闭.