【转载】cocos2dx 中 Android NDK 加载动态库的问题
cocos2dx 中 Android NDK 加载动态库的问题
闲聊
最近在接入各个平台的SDK,遇到了不少问题,也从中了解了不少知识,之前一直觉得没啥好写的,毕竟做了4个月的游戏开发,也没有碰上什么真正的大问题,cocos2dx的引擎包得也很好,能让人把大部分时间都关注在游戏逻辑、效果的处理上,当然,之前的libevent还是小坑一下,但是和后来遇到的相比,也算不上什么了。
我最早接入的SDK是360的,不知道是运气好还是点儿背,对于我这个只懂C++和lua以及一点点JAVA的人来讲,拿这个作为第一个练手,有点苦。当时对Activity这种完全没有概念的,不过也算挺过来了,回头看看也没啥太值得说道的。不过360的SDK里面就有libpaypalm_app_plugin_jar_360game.so这个动态库的接入,特别是和cocos2dx嵌入,还是有和原生的Android程序略有不同。不过还好这只有一个动态库,开始倒也用些不靠谱的方法搞定了,昨天开始接入中移动的支付SDK,里面有两个shared_library,用开始的方法搞不定了,不过今天晚上搜来搜去,终于发现点门道,希望这篇文章对和之前我一样各种苦逼的人一点帮助吧。不过深入原理我还是不懂的,别希望我能往深里挖,linux我还只局限在打几个shell命令的层次上。
需要了解的知识
- 至少对cocos2dx有所了解(写这篇文章的时候,我用的是2.1.3版本),知道NDK是什么
- 大致了解动态库和静态库的区别,知道*.so文件是什么
- 会一点JAVA,有成功跑通过cocos2dx的程序(貌似不懂JAVA也可以跑通,呵呵)
- 了解Android下的makefile的简单编写规则
我假定你是个cocos2dx的程序员,如果不是,估计帮助不大,因为我也不知道如何去类比这算是适合哪类人看的文章。
如果你正在搞三方动态库接入到cocos2dx中,那恭喜你,看过我这篇文章应该会有所帮助,我不会讲太深,反正底层的也不懂,还是以能用,知道如何用为主。
正题
PREBUILT
编写动态库(SHARED_LIBRARY)模块
说说就拿360说事儿。怎么把jar的SDK整合进去我就不展开了,具体说如何搞定里面的libpaypalm_app_plugin_jar_360game.so。
首先需要编写一个独立的动态库模块,这里说的编写,其实就相当于声明一样,告诉编译器,去哪里找什么文件链接到程序罢了,只是写个makefile,Android.mk。你可以放在当前程序的jni下,新建一个libprebuilt文件夹,然后搞个armeabi的文件夹(其他文件夹类同,360貌似是提供了两个的,不过我编译的都是armeabi类型的),把libpaypalm_app_plugin_jar_360game.so这个动态库放进去。在libprebuilt目录下新建一个Android.mk,内容如下:
- LOCAL_PATH := $(call my-dir)
- include $(CLEAR_VARS)
- LOCAL_MODULE := paypalm_app_plugin_jar_360game
- LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libpaypalm_app_plugin_jar_360game.so
- include $(PREBUILT_SHARED_LIBRARY)
稍微解释下。
- LOCAL_MODULE,这个是模块的名称,在其他地方引用这个模块,就填这个名字,一般是动态库去掉头部的lib和尾部的.so剩余的字符
- LOCAL_SRC_FILES,如果是纯三方库的话,只需要填上库的路径即可,前面的TARGET_ARCH_ABI就是用来适配你编译的CPU类型的,会去对应的文件夹下找
- PREBUILT_SHARED_LIBRARY,表明这个一个与编译的动态库,这点很重要,和静态库区分
- LOCAL_SHARED_LIBRARIE := paypalm_app_plugin_jar_360game
- include $(LOCAL_PATH)/libprebuilt/Android.mk
好了,这样build的项目,会看到最后有Install libpaypalm_app_plugin_jar_360game.so的字样,在apk中的libs下也会找到对应的*.so文件,至少,我接入的360支付算是通了。如果还是不行,请再往下看,毕竟我没有去研究过原理,不敢打包票说一定能用。
如何加载两个.so
什么是NDK_MODULE_PATH
这个我不多说,从字面上解释就是模块路径,其实也就是调用call import-module时的搜索路径。这个可以具体看篇简单的参考文章:点这里
NDK_MODULE_PATH是哪里定义的
- LOCAL_SHARED_LIBRARIES := identifyapp casdkjni
好了,build下试试,应该在最后会显示Install identifyapp.so和 Install casdkjni.so这样的输出,这表示这两个动态库被打包进了Apk中。但是不幸的是,经过这样,移动MM的支付调用起来还是会出现加载这几个so文件失败导致初始化失败的提示,其实就差最后一步。
关键一步
- static {
- System.loadLibrary("identifyapp");
- System.loadLibrary("casdkjni");
- System.loadLibrary("cocos2dcpp");
- }
加载顺序
题外话
参考
【转载】cocos2dx 中 Android NDK 加载动态库的问题的更多相关文章
- Linux下c函数dlopen实现加载动态库so文件代码举例
dlopen()是一个强大的库函数.该函数将打开一个新库,并把它装入内存.该函数主要用来加载库中的符号,这些符号在编译的时候是不知道的.这种机制使得在系统中添加或者删除一个模块时,都不需要重新编译了. ...
- LoadLibrary加载动态库失败
[1]LoadLibrary加载动态库失败的可能原因以及解决方案: (1)dll动态库文件路径不对.此场景细分为以下几种情况: 1.1 文件路径的确错误.比如:本来欲加载的是A文件夹下的动态库a.dl ...
- Windows平台LoadLibrary加载动态库搜索路径的问题
一.背景 在给Adobe Premiere/After Effects等后期制作软件开发第三方插件的时候,我们总希望插件依赖的动态库能够脱离插件的位置,单独存储到另外一个地方.这样一方面可以与其他程序 ...
- QLibrary 加载动态库
阅读本文大概需要 6.6分钟 一般情况下在没有头文件支持情况下,想要引入某个动态库,最好的办法就是使用「动态加载」的方法,在Qt中一般使用QLibyary来操作 常用 api QLibrary(con ...
- QT常用代码之加载动态库和弹出对话框
作者:朱金灿 来源:http://blog.csdn.net/clever101 加载动态库的代码: typedef void (*Execute)(); // 定义导出函数类型 QString st ...
- 使用dlopen加载动态库
目录 概述 接口 C CMakeLists.txt src/main.c src/add.c ./dlopen_test C++ CMakeLists.txt src/main.cpp src/add ...
- Android NDK加载SD卡中的so
最近公司框架刚移植完成,由于框架程序要调用子程序,每个子程序都是一个so文件,有好几百个,把所有的so和apk打包不现实,及时可以升级维护也很麻烦.所以需要放SD卡中.考虑两种方式 1 放到设备中的 ...
- Ubuntu中程序部署时无法加载动态库的解决方法
Ubuntu下修改环境变量的三种方法 添加环境变量无法解决,可尝试如下操作: sudo vim /etc/ld.so.conf 在ld.so.conf中加入动态库的目录... 然后 sudo ldco ...
- DLL中加载其它DLL使用LoadLibrary加载动态库失败的解决办法
方式一 采用LoadLibraryEx 若DLL不在调用方的同一目录下,可以用LoadLibrary(L"DLL绝对路径")加载.但若调用的DLL内部又调用另外一个DLL,此时调用 ...
随机推荐
- java静态变量、实例变量和局部变
实例变量又称成员变量: 1⃣️成员变量定义在类中,在整个类中都可以被访问 2⃣️成员变量随着对象的建立而建立,随对象的消失而消失,存在于对象所在的对内存中 3⃣️成员变量有默认初始值 局部变量: 1⃣ ...
- C++入职学习篇--代码规范(持续更新)
C++入职学习篇--代码规范(持续更新) 一.头文件规范 在头文件中大家一般会定义宏.引入库函数.声明.定义全局变量等,在设计时最后进行分类,代码示范(自己瞎琢磨的,请多多指点): #ifndef T ...
- HDU3336Count the string
HDU3336Count the string Problem Description It is well known that AekdyCoin is good at string proble ...
- 取代PHP原生函数的一些扩展包
前言 虽然程序员无时无刻都在造轮子,但造轮子也有效率之分,用好轮子才能造出好"
- hdu 5176 The Experience of Love
The Experience of Love Accepts: 11 Submissions: 108 Time Limit: 4000/2000 MS (Java/Others) Memor ...
- Redis 原子操作INCR
The content below come from http://try.redis.io/ There is something special about INCR. Why do we pr ...
- [bzoj2226][Spoj5971]LCMSum_欧拉函数_线性筛
LCMSum bzoj-2226 Spoj-5971 题目大意:求$\sum\limits_{i=1}^nlcm(i,n)$ 注释:$1\le n\le 10^6$,$1\le cases \le 3 ...
- 树剖LCA讲解
LCA的类型多种多样,只说我知道的,就有倍增求LCA,tarjin求LCA和树链剖分求LCA,当然,也还有很多其他的方法. 其中最常用,速度最快的莫过于树链剖分的LCA了. 树链剖分,首先字面理解一下 ...
- HDU 4519
实现简单,但不得不说是一道好题. 当员工数少于医生数时,直接输出K,因为此时N个员工同时检查,必定是最少的时间了. 当员工数大于医生数时,可以把员工的项目看成一段一段的,每个医生对其进行切割,总能得到 ...
- HDU 4514
真是神奇,G++TLE,C++500MS... 判环有一个图论知识就是,m>=n时必有环.如果以m的范围建图,会MLE. 然后,利用拓扑排序再来判定是否有环,因为有些景点可能是孤立的.同时,在拓 ...