cocos2d-x中使用第三方so库

blfbuaa blfbuaa     2022-08-29     196

关键词:

项目中假设使用到第三方的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 plaincopy
  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 plaincopy
  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 plaincopy
  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 plaincopy
  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的兼容,可是反过来就不行。



新手:linux下使用第三方c库(openssl),是调用.so文件还是直接调用.h文件?

新手:Linux下使用第三方C库(openssl),是调用.so文件还是直接调用.h文件?参考技术A不管什么库文件,你都既要在包含.h文件(不然编译通不过:有未声明的函数),也要在gcc选项里面指定.so文件的位置(不然链接通不过:未知... 查看详情

cmake使用链接第三方so库

..._link_libraries(test)通过上面的这些关键词,我们就可以使用第三方库了。cmake_minimum_required(VERSION2.8.12)PROJECT(main)ADD_EXECUTABLE(mainmain.c)INCLUDE_DIRECTORIES(/usr/include/hello)#静态链接库#TARGET_LINK_LIBRARIES(mainlibhello.a)#动态链接库set(LINK_DIR/usr/local... 查看详情

androidndk系列-as导入so三方库,使用c/c+方法(代码片段)

NDK系列(一)-AS使用javah生成so文件NDK系列(二)-AS使用CmakeLists生成so文件NDK系列(三)-AS编写C文件没有提示和不识别NULLNDK系列(四)-AS生成jar包、导入so库并使用方法接着捣鼓ndk,我们在开发的时候࿰... 查看详情

androidndk系列-as导入so三方库,使用c/c+方法(代码片段)

NDK系列(一)-AS使用javah生成so文件NDK系列(二)-AS使用CmakeLists生成so文件NDK系列(三)-AS编写C文件没有提示和不识别NULLNDK系列(四)-AS生成jar包、导入so库并使用方法接着捣鼓ndk,我们在开发的时候࿰... 查看详情

android加载第三方so库(代码片段)

本篇文章使用的androidstudio版本是:AndroidStudioBumblebee|2021.1.1Patch2上一篇文章:Android开发java调用C简单示例演示了java调C++,那么so文件能否复用到别的项目了?这次我们尝试用上一篇文章生成的so库,调用里面的... 查看详情

如何在 Mac os 中链接 linux .so 共享库?

...yinMacos?【发布时间】:2015-05-3116:51:21【问题描述】:我有第三方给我.so文件,该文件已经编译共享库。就像:filesecuritymduserapi.sosecuritymduserapi.so:ELF64-bitLSBsharedobject,x86-64,version1(S 查看详情

androidndk开发:通过c/c++调用第三方so库(代码片段)

文章目录一、编写so库代码二、安装AndroidNDK三、编译so库3.1编辑Android.mk3.2编辑Application.mk3.3编译四、集成到Android工程中上一篇打包so库及jar包的博客我讲了如何将自己的代码打包成so库,并且配合jar包供他人调用。但那种方式... 查看详情

androidstudio调用第三方动态库

目录目录前言AndroidStudio导入动态库前言今天用AndroidStudio写了一个应用来实现应用层控制抬手亮屏功能。由于抬手亮屏的控制需要借助JNI调用底层kernel的接口,所以这里记录一下AndroidStudio中使用动态库的注意事项。比较水... 查看详情

android如何调用第三方so库

转自:http://zwz94.blog.163.com/blog/static/3206039520131111101412959/问题描述:Android如何调用第三方SO库;已知条件:SO库为Android版本连接库(*.so文件),并提供了详细的接口说明;已了解解决方案ÿ 查看详情

android中怎么调用第三方的so动态库啊~在线等...

...找了很多资料,参照的做法。但是运行的时候,一直都是第三方的画面。感觉自己写的没有运行到~这是怎么回事?是android.mk写的有问题吗?下面是mk的代码,irrlicht是第三方的so文件,自己写的是irrlichtSample各种求助啊~~~在线等~~... 查看详情

Zend Framework 2 使用 composer 自动加载第三方库

】ZendFramework2使用composer自动加载第三方库【英文标题】:ZendFramework2AutoloadThirdPartylibraryusingcomposer【发布时间】:2013-12-0615:46:24【问题描述】:我正在尝试使用composer将第三方库自动加载到我的ZF2应用程序中-特别是Googleapi。我在S... 查看详情

as使用ndkbuild创建cpp工程记录

...所以必须要使用ndk方式,记录下过程。现状是,我们得到第三方的.so和一些头文件类,需要使用这些类和函数来完成我们的功能,比如说机器学习算法运算库,但如何使用这些在.so内的函数呢?需要把.so和头文件加载到项目中,... 查看详情

aar生成方法

使用第三方库出现找不到so库UnsatisfiedLinkError错误的原因以及解决方案字数1563阅读913评论2喜欢2在开发项目的时候我们免不了使用一些第三方的库来进行快速开发,有些第三方库只是简单的一个jar包,但是有些使用了jni开发,因... 查看详情

我的android进阶之旅ndk开发引入第三方so库(比如assimp和opencv库)常出现的几个问题:missingandnoknownruletomakeit等

文章目录一、写这篇博客的原因二、错误一、ninja:error:\'xxx.so\',neededby\'yyy.so\',missingandnoknownruletomakeit2.1错误描述2.2错误分析2.3解决错误三、错误二error:undefinedreferenceto3.1错误原因3.2分析问题:cmake关于set的使用3.3解决问题四、错误... 查看详情

用androidstudio引入第三方so库,怎么调不了方法

之前一直没有做过第三方的推送消息,这次公司要求采用国内极光第三方推送服务,由于项目还在原型图构思中,因而还可以花点时间看看这方面的东西。看了下相关的DEMO,挺简单的,加点权限,把相关的广播以及服务注册一... 查看详情

androidso库开发——使用studio调用so库(代码片段)

...放到libs中,并按照上面文章中MainActivity中的调用方法使用。1、build.gradle(app)配置androiddefaultConfig//加载so类型ndkabiFilters'armeabi-v7a','arm64-v8a','x86','x86_64'//so库路径sourceSetsmainjniLibs.srcDirs=['l... 查看详情

cmake中target_link_libraries()使用问题动态库使用绝对路径没问题,但是使用相对路径就矬了?

...,就像直接使用gcc/g++来链接的时候一样,要使用-L来指定第三方库所在路径。cmake可以使用 LINK_DIRECTORIES命令来指定第三方库所在路径,比如,你的动态库在/home/myproject/libs这个路径下,则通过命令:LINK_DIRECTORIES(/home/myproject/l... 查看详情

如何限制对共享对象中符号的访问?

...它链接到一个更大的程序(foo)。foo和bar.so都依赖于同一个第三方库(baz),但它们需要将baz的实现完全分开。因此,当我链接foo(使用提供的目标文件和档案)时,我需要它忽略bar.so中 查看详情