项目中假设使用到第三方的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. appium 测试模拟器时输入adb devices显示 unauthorized

    https://stackoverflow.com/questions/32132434/set-adb-vendor-keys 也就是点击AVD管理器右边的下拉列表,点击清除数据,再重启虚拟机 0d ...

  2. C#中SortedList类的使用

    C#中SortedList类 命名空间:System.Collections 程序集:mscorlib(在mscorlib.dll中) 语法:public class SortedList : IDi ...

  3. 关于RBAC(Role-Base Access Control)的理解

    基于角色的访问控制(Role-Base Access Control) 有两种正在实践中使用的RBAC访问控制方式:隐式(模糊)的方式和显示(明确)的方式. 今天依旧有大量的软件应用是使用隐式的访问控 ...

  4. C++之类成员所占内存大小问题总结

    1.空类所占字节数为1,可见代码如下 #include <iostream> using namespace std; class Parent { }; class Child:publ ...

  5. 关于VS下的应用程序出现0xc000007b的问题以及OpenCV相关的0xc000007b问题

    本文参考过其他一些文章: http://www.cnblogs.com/csuftzzk/p/windows_launch_error_0xc000007b.html 这个问题在网上一查一大堆,主要的 ...

  6. 在eclipse中使用Lombok

    1.下载Lombok.jar http://projectlombok.googlecode.com/files/lombok.jar2.运行Lombok.jar: java -jar  D:\001 ...

  7. log4j教程 10、PatternLayout

    如果想生成基于模式的特定格式的日志信息,那么可以使用 org.apache.log4j.PatternLayout 格式化日志信息. PatternLayout类扩展抽象 org.apache.log ...

  8. Android学习(十六) 通过GestureDetector进行手势识别

    一.手势交互过程: 1)触屏时,触发MotionEvent事件. 2)被OnTouchListener监听,在onTouch()中获得MotionEvent对象. 3)GestureDetector转 ...

  9. 【HTML5】用脚本控制交互元素details元素的使用

    1.源码 <!. Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quo ...

  10. UINavigationbar/UINavigationItem/UITabBar/UITabButton/UITabBarItem粑粑粑粑~

    看着标题是不是乱的一塌糊涂...... . 在开发中,你非常可能就理不清这些关系,刚好闲的蛋疼,来整理一下吧. 一.UINavigationBar.UINavigationItem.UIBarButt ...