项目中假设使用到第三方的SDK,大多数是以.so动态共享库的文件打包给我们使用。怎样使用他们,见以下分析。

1、获得库文件

假如我们得到的库文件是libxxx.so(注:关于.so文件的命名方式,可百度)。

在Jni文件夹下新建prebuilt文件夹,把获得的库文件

复制到该目录下。

2、使用库文件

库文件的使用须要改动Android.mk,在mk文件里增加下面代码:
include $(CLEAR_VARS)
LOCAL_MODULE := xxx
LOCAL_SRC_FILES := prebuilt/libxxx.so
include $(PREBUILT_SHARED_LIBRARY) LOCAL_SHARED_LIBRARIES := xxx

Java中调用

<span style="background-color: rgb(0, 204, 204);">static {
System.loadLibrary("XXX");
System.loadLibrary("cocos2dcpp");
} </span>

3、编译

编译后会在libs/armeabi文件夹下生产我们须要的libxxx.so文件,并编译到APK中。

4、万普样例

下面是万普平台Demo的mk文件,在这贴出来。让大家体会下面用法。
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := uninstall //第一步 LOCAL_SRC_FILES := prebuilt/libuninstall.so //第二步
include $(PREBUILT_SHARED_LIBRARY) //第三步 include $(CLEAR_VARS) $(call import-add-path,$(LOCAL_PATH)/../../cocos2d)
$(call import-add-path,$(LOCAL_PATH)/../../cocos2d/external)
$(call import-add-path,$(LOCAL_PATH)/../../cocos2d/cocos) LOCAL_MODULE := cocos2dcpp_shared LOCAL_MODULE_FILENAME := libcocos2dcpp //<span style="background-color: rgb(0, 204, 204);">将引用的库加上cpp源文件共同打包出libcocos2dcpp库
</span>
LOCAL_SRC_FILES := hellocpp/main.cpp \
../../Classes/AppDelegate.cpp \
../../Classes/HelloWorldScene.cpp\
../../Classes/WapsAd.cpp LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes LOCAL_WHOLE_STATIC_LIBRARIES := cocos2dx_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocosdenshion_static
LOCAL_WHOLE_STATIC_LIBRARIES := cocos_extension_static
LOCAL_WHOLE_STATIC_LIBRARIES += box2d_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocostudio_static # 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 $(CLEAR_VARS)
LOCAL_SHARED_LIBRARIES := uninstall //第四步 $(call import-module,.)
$(call import-module,audio/android)
$(call import-module,Box2D)
$(call import-module,editor-support/cocostudio)
$(call import-module,extensions) # $(call import-module,Box2D)
# $(call import-module,editor-support/cocosbuilder)
# $(call import-module,editor-support/spine)
# $(call import-module,editor-support/cocostudio)
# $(call import-module,network)
# $(call import-module,extensions)

注意事项

在主java文件里找到System.loadLibrary("cocos2dcpp");这句,然后在以下相同添上你要载入的三方库名称就可以。

貌似默认不指明的话,会到系统路径下去找so文件(没有root或system的权限。无权对这个文件夹操作),这几个so按道理是会装到data/appname/lib文件夹下的。

载入顺序

这里有个问题要尤其注意,就是这些动态库的载入顺序,一定要放到libcocos2dcpp前载入。否则在载入libcocos2dcpp时。会由于没有之前这两个依赖的动态库而报错,报的就是相应的动态库木有载入


Android可行载入第三方库文档,转载自:http://blog.csdn.net/smfwuxiao/article/details/8523479

Android NDK r5 開始支持预编译库(动态库和静态库),即程序能使用库的预编译版本号。

该特性可用于下面双方面:

1)向第三方NDK开发者公布你的共享库而不用提供源代码。

2)使用一个提前编译好的库(预编译库)来加速编译过程。

本文说明该特性怎样工作。

I. 声明一个预编译库的模块

对于Android编译工具而言,每一个预编译库必须声明为一个独立的模块。这里举一个样例。如果 libfoo.so 文件与 Android.mk 位于同一个文件夹:

[plain] view
plain
copy

  1. LOCAL_PATH := $(call my-dir)
  2. include $(CLEAR_VARS)
  3. LOCAL_MODULE := foo-prebuilt
  4. LOCAL_SRC_FILES := libfoo.so
  5. include $(PREBUILT_SHARED_LIBRARY)

按下面步骤声明这样一个模块:

1. 给该模块取一个名字(这里是 foo-prebuilt)。这个名字不须要与预编译库自身的名字同样。

2. 将 LOCAL_SRC_FILES 指定为你要提供的共享库的路径。通常,该路径是相对于 LOCAL_PATH 的路径。

注意:必须保证共享库ABI的兼容性。

3. 假设你的库是共享库,则包括 PREBUILT_SHARED_LIBRARY 而不是 BUILD_SHARED_LIBRARY。假设是静态库,则包括 PREBUILT_STATIC_LIBRARY。

预编译模块不须要编译。

该预编译模块会被复制到 $PROJECT/obj/local 以下。还会被复制到 $PROJECT/libs/<abi> 以下(这里的库被strip过)。

II. 在其它模块中引用这个预编译库

在依赖该预编译库的模块相应的Android.mk中,将预编译库的名字(前面取的)增加到 LOCAL_STATIC_LIBRARIES 或 LOCAL_SHARED_LIBRARIES 声明中。比如,一个使用上面libfoo.so的简单样例例如以下:

[plain] view
plain
copy

  1. include $(CLEAR_VARS)
  2. LOCAL_MODULE := foo-user
  3. LOCAL_SRC_FILES := foo-user.c
  4. LOCAL_SHARED_LIBRARIES := foo-prebuilt
  5. include $(BUILD_SHARED_LIBRARY)

III. 将预编译库的头文件导出

得到预编译库之后。一般须要它相应的头文件。比如前面的libfoo.so,它有相应的foo.h。编译依赖libfoo.so的模块时。须要将该头文件和它的路径提供给NDK编译系统。一种简单方法是,前面在定义该预编译库的时候,使用LOCAL_EXPORT_C_INCLUDES 变量。

比如。如果文件 foo.h 位于当前预编译模块所在文件夹的 include 子文件夹,则能够在预编译模块的Android.mk文件里编写例如以下:

[plain] view
plain
copy

  1. include $(CLEAR_VARS)
  2. LOCAL_MODULE := foo-prebuilt
  3. LOCAL_SRC_FILES := libfoo.so
  4. LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
  5. include $(PREBUILT_SHARED_LIBRARY)

这个 LOCAL_EXPORT_C_INCLUDES 定义确保了不论什么依赖这个预编译库的模块会自己主动在自己的 LOCAL_C_INCLUDES 变量中添加到这个预编译库的include文件夹的路径。从而可以找到当中的头文件。

IV. 调试预编译库

建议你在预编译库中保留调试信息。位于 $PROJECT/libs/<abi> 的版本号都是不含调试信息的(被NDK编译系统运行strip过的)。调试版的库才干用于 ndk-gdb。

V. 共享库ABI的选择

如前所述,共享库与目标系统的ABI兼容性至关重要。应检查一下
TARGET_ARCH_ABI 的值,能够是下面值:

armeabi        目标系统CPU是ARMv5TE或更高

armeabi-v7a    目标系统CPU是ARMv7或更高

x86            目标系统CPU是x86

注意。armeabi-v7a的CPU能够非常好地运行armeabi的程序。

举一个样例。我们提供一个预编译库的两个版本号,然后选择不同的ABI:

[plain] view
plain
copy

  1. include $(CLEAR_VARS)
  2. LOCAL_MODULE := foo-prebuilt
  3. LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libfoo.so
  4. LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
  5. include $(PREBUILT_SHARED_LIBRARY)

这里如果要拷贝的预编译库所在的文件夹结构例如以下:

    Android.mk            --> 编译这个预编译库的Android.mk

    armeabi/libfoo.so     --> armeabi版本号的共享库

    armeabi-v7a/libfoo.so --> armeabi-v7a版本号的共享库

    include/foo.h         --> 预编译库导出的头文件

注意:你不必提供armeabi-v7a版本号,由于armeabi版本号的共享库可以被armeabi-v7a的兼容,可是反过来就不行。


Cocos2d-x中使用第三方so库的更多相关文章

  1. CocoaPods:管理Objective-c 程序中各种第三方开源库关联

    在我们的iOS程序中,经常会用到多个第三方的开源库,通常做法是去下载最新版本的开源库,然后拖拽到工程中. 但是,第三方开源库的数量一旦比较多,版本的管理就非常的麻烦.有没有什么办法可以简化对第三方库的 ...

  2. (转)CocoaPods:管理Objective-c 程序中各种第三方开源库关联

    在我们的iOS程序中,经常会用到多个第三方的开源库,通常做法是去下载最新版本的开源库,然后拖拽到工程中. 但是,第三方开源库的数量一旦比较多,版本的管理就非常的麻烦.有没有什么办法可以简化对第三方库的 ...

  3. 在 Ionic2 TypeScript 项目中导入第三方 JS 库

    原文发表于我的技术博客 本文分享了在Ionic2 TypeScript 项目中导入第三方 JS 库的方法,供参考. 原文发表于我的技术博客 1. Typings 的方式 因在 TypeScript 中 ...

  4. 在Pycharm中导入第三方模块库(诸如:matplotlib、numpy等)

    在Pycharm中导入第三方模块库 一.打开pycharm: 二.点击菜单上的“file” -> “setting”: 三.步骤二完成后出现界面如下所示.选中你的项目(比如thisyan Pro ...

  5. 如何在Ionic2项目中使用第三方JavaScript库

    onic的官网放出一记大招Ionic and Typings,来介绍如何在Ionic2项目中使用第三方JavaScript库. 因为在前阵子正好想用一个非常有名的第三方JS库ChartJs来实现一些东 ...

  6. 如何在 FineUIMvc 中引用第三方 JavaScript 库

    声明:FineUIMvc(基础版)是免费软件,本系列文章适用于基础版. 引入第三方颜色选择器 在 FineUIMvc 中使用第三方 JavaScript 遵循一定的约定,也非常简单. 下面以官网示例为 ...

  7. Python中导入第三方声源库Acoular的逻辑解释以及Acoular的下载

    [声明]欢迎转载,但请保留文章原始出处→_→ 秦学苦练:http://www.cnblogs.com/Qinstudy/ 文章来源:http://www.cnblogs.com/Qinstudy/p/ ...

  8. vue中使用第三方UI库的移动端rem适配方案

    需求:使用vue-cli脚手架搭建项目,并且使用第三方的UI库(比如vant,mint ui)的时候,因为第三方库用的都是用px单位,无法使用rem适配不同设备的屏幕. 解决办法:使用px2rem-l ...

  9. 在 Angular 2 Component 中使用第三方 JS 库

    本文所有内容以 Angular 2 Quick Start 项目为基础,使用 TypeScript 语言. 如上图,最近遇到一个需求,需要在一个刚启动的 Angular 2 项目中使用 snap.sv ...

随机推荐

  1. JsonArray对象

    直接上代码: private static JSONObject createJSONObject() { JSONObject jsonObject = new JSONObject(); json ...

  2. 6、Python模块

    最常用的两个模块: os    #可以允许python调用执行系统命令,如shell sys    #处理与python程序本身的事情   Python自带200多个常用模块 Python官网收集了2 ...

  3. 记一次有惊无险的Linux数据恢复过程

    问题阶段 起因: 昨天晚上思路不是很清晰(上了一天班回来有点蒙),还是强忍着疲惫想搞事情,结果悲剧了… … 本来想拿SD卡做一张linux烧录卡,烧录脚本是很久以前写的,有git记录,一直不成功,就回 ...

  4. 第一章 初识shiro

    shiro学习教程来自开涛大神的博客:http://jinnianshilongnian.iteye.com/blog/2018936 第一章 初识shiro 简单了解shiro主要记住三张图即可. ...

  5. Effective C++--经验条款

    高效C++ --模板与泛型编程 在C++中模板体现的是编译期多态,virtual体现的是执行期多态. 关于typename的双重含义: 在声明template參数时,不论使用keywordclass或 ...

  6. HDU4911:Inversion

    Problem Description bobo has a sequence a1,a2,-,an. He is allowed to swap two adjacent numbers for n ...

  7. Android学习(二) 标签滚动跳过

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools= ...

  8. 四种异步更新UI的方法

    Android要求只能在UI线程中更新UI,要想在其他线程中更新UI,大致有四种方式: 1.使用Handler消息传递机制(推荐)2.使用AsyncTask异步任务(推荐)3.使用runOnUiThr ...

  9. react-native 详解

    1.获取主屏幕尺寸 // 导入类库 var Dimensions = require('Dimensions'); // 样式 const styles = StyleSheet.create({ c ...

  10. Android下缓存以及解决OOM问题

    1 http://my.oschina.net/ryanhoo/blog/93285 开篇来个简单的后续的慢慢补充 2 http://www.apkbus.com/forum.php?mod=view ...