android ndk 加载so的策略

2 篇文章 0 订阅
0. 动态库加载方式:
方法1:在运行时动态链接库, 动态地将程序和共享库链接并让 Linux 在执行时加载库(动态链接,系统加载)

方法2:动态加载库并在程序控制之下使用它们。(动态加载)




动态链接(系统加载):是指在编译应用程序时,使用 -lxxx 来指定需要链接哪个库。此时,应用程序(ELF)中会指明哪些符号未被填充,且放在哪些动态库中。 LD_LIBRARY_PATH则指明动态库在哪里存放。系统会将此动态库加载到内存中使用。

动态加载:使用dlopen打开指定的动态库。并使用>>
也就是说:System.LoadLibrary(A),将最简单的壳子动态库加入内存。

此壳子动态库A在onCreate()时调用dlopen将所有所需动态库加入内存(引擎,游戏)。
在onDestory()时,则dlclose(),将动态库移出内存。

而在循环中,游戏动态库被dlopen,dlsym取出相应几个有限的符号并调用。

而在这些符号内,他们直接使用引擎提供的函数。因为此时引擎已经被加载入内存。所以可以使用。

dlclose时,游戏和引擎都被移出内存。


(注:有很多游戏,但引擎只有一个,游戏使用此共同的引擎提供的函数)


第三方C++库的移植:
在开发Android大型程序时,不可避免要用到很多第三方OpenSouce.而大多数第三方库采用AutoConfig,或者CMake等特定编译工具编译。现在就说说如何利用NDK将其编译成咱们能够使用的静态库或者动态库。

现在以xiph-ogg为例,演示如何使用NDK编译这些第三方库。

0. 准备工作:
下载xiph>
include $(CLEAR_VARS)
LOCAL_ARM_MODE :=>LOCAL_SRC_FILES :=>LOCAL_CFLAGS += -I/opt/Android-NDK/android-ndk-r8b/samples/xiph/xiph/ogg/include
#LOCAL_SHARED_LIBRARIES :=                                                                                                          
LOCAL_LDLIBS := -llog
#include $(BUILD_EXECUTABLE)                                                                                                        
include $(BUILD_SHARED_LIBRARY)
#include $(BUILD_STATIC_LIBRARY) 


编译之:
../../../../../ndk-build -B V=1
在xiph/ogg/libs/armeabi-v7a/下生成libogg.so

libvorbisfile.so  libvorbis.so的建立也一样,Android.mk如下:
LOCAL_PATH := $(call>LOCAL_MODULE :=>LOCAL_CFLAGS += -I/opt/Android-NDK/android-ndk-r8b/samples/xiph/xiph/vorbis/include
LOCAL_CFLAGS += -I/opt/Android-NDK/android-ndk-r8b/samples/xiph/xiph/vorbis/lib


LOCAL_LDLIBS := -lm
LOCAL_LDLIBS += -logg


#LOCAL_SHARED_LIBRARIES :=                                                                                                          
LOCAL_LDLIBS += -llog
LOCAL_LDLIBS += -L/opt/Android-NDK/android-ndk-r8b/samples/xiph/NDK_Build/ogg/libs/armeabi-v7a
#include $(BUILD_EXECUTABLE)                                                                                                        
include $(BUILD_SHARED_LIBRARY)
#include $(BUILD_STATIC_LIBRARY)                                                                                                    

include $(CLEAR_VARS)
LOCAL_ARM_MODE :=>LOCAL_SRC_FILES :=>LOCAL_CFLAGS += -I/opt/Android-NDK/android-ndk-r8b/samples/xiph/xiph/ogg/include
LOCAL_CFLAGS += -I/opt/Android-NDK/android-ndk-r8b/samples/xiph/xiph/vorbis/include
LOCAL_CFLAGS += -I/opt/Android-NDK/android-ndk-r8b/samples/xiph/xiph/vorbis/lib

LOCAL_LDLIBS := -lm
LOCAL_LDLIBS += -logg
LOCAL_LDLIBS += -lvorbis


#LOCAL_SHARED_LIBRARIES :=                                                                                                         \
                                                                                                                                    
LOCAL_LDLIBS += -llog
LOCAL_LDLIBS += -L/opt/Android-NDK/android-ndk-r8b/samples/xiph/NDK_Build/ogg/libs/armeabi-v7a
LOCAL_LDLIBS += -L/opt/Android-NDK/android-ndk-r8b/samples/xiph/NDK_Build/vorbis/libs/armeabi-v7a
#include $(BUILD_EXECUTABLE)                                                                                                       \
                                                                                                                                    
include $(BUILD_SHARED_LIBRARY)
#include $(BUILD_STATIC_LIBRARY) 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值