Cocos2d-x中使用第三方so库
项目中假设使用到第三方的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文件夹下的。
载入顺序
Android NDK r5 開始支持预编译库(动态库和静态库),即程序能使用库的预编译版本号。
该特性可用于下面双方面:
1)向第三方NDK开发者公布你的共享库而不用提供源代码。
2)使用一个提前编译好的库(预编译库)来加速编译过程。
本文说明该特性怎样工作。
I. 声明一个预编译库的模块
对于Android编译工具而言,每一个预编译库必须声明为一个独立的模块。这里举一个样例。如果 libfoo.so 文件与 Android.mk 位于同一个文件夹:
- LOCAL_PATH := $(call my-dir)
- include $(CLEAR_VARS)
- LOCAL_MODULE := foo-prebuilt
- LOCAL_SRC_FILES := libfoo.so
- 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的简单样例例如以下:
- include $(CLEAR_VARS)
- LOCAL_MODULE := foo-user
- LOCAL_SRC_FILES := foo-user.c
- LOCAL_SHARED_LIBRARIES := foo-prebuilt
- include $(BUILD_SHARED_LIBRARY)
III. 将预编译库的头文件导出
得到预编译库之后。一般须要它相应的头文件。比如前面的libfoo.so,它有相应的foo.h。编译依赖libfoo.so的模块时。须要将该头文件和它的路径提供给NDK编译系统。一种简单方法是,前面在定义该预编译库的时候,使用LOCAL_EXPORT_C_INCLUDES 变量。
比如。如果文件 foo.h 位于当前预编译模块所在文件夹的 include 子文件夹,则能够在预编译模块的Android.mk文件里编写例如以下:
- include $(CLEAR_VARS)
- LOCAL_MODULE := foo-prebuilt
- LOCAL_SRC_FILES := libfoo.so
- LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
- 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:
- include $(CLEAR_VARS)
- LOCAL_MODULE := foo-prebuilt
- LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libfoo.so
- LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
- 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库的更多相关文章
- CocoaPods:管理Objective-c 程序中各种第三方开源库关联
在我们的iOS程序中,经常会用到多个第三方的开源库,通常做法是去下载最新版本的开源库,然后拖拽到工程中. 但是,第三方开源库的数量一旦比较多,版本的管理就非常的麻烦.有没有什么办法可以简化对第三方库的 ...
- (转)CocoaPods:管理Objective-c 程序中各种第三方开源库关联
在我们的iOS程序中,经常会用到多个第三方的开源库,通常做法是去下载最新版本的开源库,然后拖拽到工程中. 但是,第三方开源库的数量一旦比较多,版本的管理就非常的麻烦.有没有什么办法可以简化对第三方库的 ...
- 在 Ionic2 TypeScript 项目中导入第三方 JS 库
原文发表于我的技术博客 本文分享了在Ionic2 TypeScript 项目中导入第三方 JS 库的方法,供参考. 原文发表于我的技术博客 1. Typings 的方式 因在 TypeScript 中 ...
- 在Pycharm中导入第三方模块库(诸如:matplotlib、numpy等)
在Pycharm中导入第三方模块库 一.打开pycharm: 二.点击菜单上的“file” -> “setting”: 三.步骤二完成后出现界面如下所示.选中你的项目(比如thisyan Pro ...
- 如何在Ionic2项目中使用第三方JavaScript库
onic的官网放出一记大招Ionic and Typings,来介绍如何在Ionic2项目中使用第三方JavaScript库. 因为在前阵子正好想用一个非常有名的第三方JS库ChartJs来实现一些东 ...
- 如何在 FineUIMvc 中引用第三方 JavaScript 库
声明:FineUIMvc(基础版)是免费软件,本系列文章适用于基础版. 引入第三方颜色选择器 在 FineUIMvc 中使用第三方 JavaScript 遵循一定的约定,也非常简单. 下面以官网示例为 ...
- Python中导入第三方声源库Acoular的逻辑解释以及Acoular的下载
[声明]欢迎转载,但请保留文章原始出处→_→ 秦学苦练:http://www.cnblogs.com/Qinstudy/ 文章来源:http://www.cnblogs.com/Qinstudy/p/ ...
- vue中使用第三方UI库的移动端rem适配方案
需求:使用vue-cli脚手架搭建项目,并且使用第三方的UI库(比如vant,mint ui)的时候,因为第三方库用的都是用px单位,无法使用rem适配不同设备的屏幕. 解决办法:使用px2rem-l ...
- 在 Angular 2 Component 中使用第三方 JS 库
本文所有内容以 Angular 2 Quick Start 项目为基础,使用 TypeScript 语言. 如上图,最近遇到一个需求,需要在一个刚启动的 Angular 2 项目中使用 snap.sv ...
随机推荐
- C# Json格式字符串
转自:http://www.cnblogs.com/unintersky/p/3884712.html 将Json字符串转化成格式化表示的方法: 字符串反序列化为对象-->对象再序列化为字符串 ...
- Sync 攻击原理及防范技术
据统计,在所有黑客攻击事件中,SYN攻击是最常见又最容易被利用的一种攻击手法.相信很多人还记得2000年YAHOO网站遭受的攻击事例,当时黑客利用的就是简单而有效的SYN攻击,有些网络蠕虫病毒配合SY ...
- JAVA常见算法题(十九)
package com.xiaowu.demo; /** * * 有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和. * * * @author WQ ...
- DateFormatUtil格式化时间
package org.xiaowu.json.demo; import java.util.Calendar; import java.util.Date; import org.apache.co ...
- 容器窗口 <QTabWidget>
////////////////////////////////////////// #include "test9_2a.h" #include "M_win.h&qu ...
- javascript正则表达式小技巧
一.中括号[]里面的特殊字符是不用转义的,例如[/].[.].[*].[?].[+]都是可以直接匹配对应的字符\ . *?+.下面是测试结果: 所以,/[\d.]/这个正则表达式实际上是匹配数字字符或 ...
- Java源码阅读Vector
1类签名与注释 public class Vector<E> extends AbstractList<E> implements List<E>, RandomA ...
- Timeline简单配置
Timeline是一个Jquery时间轴插件.效果如图 获取地址:https://github.com/ka215/jquery.timeline 配置 (1)html表头加入 <link re ...
- 【Zookeeper】Zookeeper部署笔记
Zookeeper部署笔记 .上传zk安装包 .解压 .配置(先在一台节点上配置) .1添加一个zoo.cfg配置文件 $ZOOKEEPER/conf mv zoo_sample.cfg zoo.cf ...
- C#设计模式---观察者模式简单例子
在开发过程中经常遇到一个模块中的 一个方法调用了其他模块中相关的方法 比如说在一个系统中,如果出现了错误,就调用专门进行错误处理的模块中的方法进行错误处理 而因为错误处理的操作有很多,所以将这些具体的 ...