作者: Sam (甄峰) <wbr><span><span></span></span><wbr><span>sam_code@hotmail.com</span><br><br><strong><span style="color:rgb(153,0,48); line-height:21px; word-wrap:normal; word-break:normal">0. 动态库加载方式:</span></strong><br><span><span style="font-size:14px; line-height:21px; word-wrap:normal; word-break:normal">方法1:在运行时动态链接库,</span></span><span><span></span></span><span><span style="font-family:arial,nsimsun,sans-serif; text-align:left; line-height:normal; background-color:rgb(255,255,255); word-wrap:normal; word-break:normal">动态地将程序和共享库链接并让 Linux 在执行时加载库(<strong>动态链接,系统加载</strong>)</span></span><span><span style="font-size:14px; line-height:21px; word-wrap:normal; word-break:normal"><br> 方法2:动态加载库并在程序控制之下使用它们。(<strong>动态加载</strong>)<br><br></span></span><a href="http://photo.blog.sina.com.cn/showpic.html#blogid=602f877001015201&url=http://s7.sinaimg.cn/orignal/602f8770hc08ab616bf06" target="_blank" style="color:rgb(106,57,6); text-decoration:none"><img title="Android<wbr>NDK学习<wbr><六><wbr>复杂结构动态库处理和第三方库的移植" name="image_operate_4911337602241875" alt="Android<wbr>NDK学习<wbr><六><wbr>复杂结构动态库处理和第三方库的移植" src="http://s7.sinaimg.cn/middle/602f8770hc08ab616bf06&690" width="344" height="151" style="border-top-style:none; border-right-style:none; border-bottom-style:none; border-left-style:none; border-width:initial; border-color:initial; padding-bottom:0px; border-right-width:0px; list-style-type:none; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-left:0px; padding-right:0px; border-top-width:0px; border-bottom-width:0px; border-left-width:0px; padding-top:0px"></a><br><br><strong><span style="color:rgb(153,0,48); line-height:21px; word-wrap:normal; word-break:normal">动态链接(系统加载)</span></strong><span>:是指在编译应用程序时,使用 -lxxx 来指定需要链接哪个库。此时,应用程序(ELF)中会指明哪些符号未被填充,且放在哪些动态库中。<span></span></span><span><span style="font-size:14px; line-height:21px; word-wrap:normal; word-break:normal">LD_LIBRARY_PATH则指明动态库在哪里存放。系统会将此动态库加载到内存中使用。<br></span><br><strong><span style="color:rgb(153,0,48); line-height:21px; word-wrap:normal; word-break:normal">动态加载</span></strong>:使用dlopen打开指定的动态库。并使用</span><span><span></span></span><span>dlsym</span><span></span><wbr><span>获取符号地址。这是插件式程序的必备方式。</span><br><span><br><br><br><br><span style="line-height:normal; font-family:monospace"><span style="color:rgb(153,0,48); line-height:21px; word-wrap:normal; word-break:normal">1. C++大型程序常见的模块组织方式</span></span><span style="font-family:monospace; line-height:21px; word-wrap:normal; word-break:normal"><span style="line-height:normal; word-wrap:normal; word-break:normal">:</span></span><br><br><span style="font-family:monospace; line-height:21px; word-wrap:normal; word-break:normal"><span style="line-height:normal; word-wrap:normal; word-break:normal">不少C++大型程序以如下方式设计:</span></span><br><span style="font-family:monospace; line-height:21px; word-wrap:normal; word-break:normal"><span style="line-height:normal; word-wrap:normal; word-break:normal">1. 有一个主程序块,此程序块通常作用是读取配置文件,并根据配置文件动态加载以插件形式提供的功能模块。(即dlopen(插件)) 并维护主循环,每次循环中依次调用每个插件中的某功能(dlsym(符号)并运行)。</span></span><br><span style="font-family:monospace; line-height:21px; word-wrap:normal; word-break:normal"><span style="line-height:normal; word-wrap:normal; word-break:normal">在退出时,使用dlclose() 将各插件移出内存并退出主循环。</span></span><br><br><span style="font-family:monospace; line-height:21px; word-wrap:normal; word-break:normal"><span style="line-height:normal; word-wrap:normal; word-break:normal">2. 不同插件同样利用配置文件维护他们所用到的自有模块。(dlopen, dlsym)</span></span><br><br><span style="font-family:monospace; line-height:21px; word-wrap:normal; word-break:normal"><span style="line-height:normal; word-wrap:normal; word-break:normal">3. 如有必要,各插件以动态库的形式共同使用某模块(尤其是第三方模块)。 (使用动态链接,系统加载的方式)</span></span><br><br><br><span style="font-family:monospace; line-height:21px; word-wrap:normal; word-break:normal"><span style="line-height:normal; word-wrap:normal; word-break:normal">例如:</span></span><br><span style="font-family:monospace; line-height:21px; word-wrap:normal; word-break:normal"><span style="line-height:normal; word-wrap:normal; word-break:normal">某程序以如下方式构建:</span></span><br><span style="font-family:monospace; line-height:21px; word-wrap:normal; word-break:normal"><span style="line-height:normal; word-wrap:normal; word-break:normal">1. 核心程序为一个应用程序,此应用程序主要通过分析配置文件,决定加载哪些插件。同时,它维护一个循环,每个循环中调用插件的特定符号(update)。</span></span><br><br><span style="font-family:monospace; line-height:21px; word-wrap:normal; word-break:normal"><span style="line-height:normal; word-wrap:normal; word-break:normal">2. 插件包括:音频库,文件系统,动作分析系统等。同时,各个游戏逻辑也作为插件存在。即从大厅进入游戏,其实就是替换一些插件。</span></span><br><br><span style="font-family:monospace; line-height:21px; word-wrap:normal; word-break:normal"><span style="line-height:normal; word-wrap:normal; word-break:normal">3. 游戏模块依赖于引擎A。(以动态链接,系统加载方式使用)</span></span><br><br><span style="font-family:monospace; line-height:21px; word-wrap:normal; word-break:normal"><span style="line-height:normal; word-wrap:normal; word-break:normal">这样,在Linux下,可以将引擎以及底层库放置于LD_LIBRARY_PATH制定位置。整个软件可正常运行。</span></span><br><br><br><br><span style="font-family:monospace; line-height:21px; word-wrap:normal; word-break:normal"><span style="line-height:normal; word-wrap:normal; word-break:normal"><strong><span style="color:rgb(153,0,48); line-height:21px; word-wrap:normal; word-break:normal">2. Android 下对NDK动态库的使用</span>:</strong></span></span><br><span style="font-family:monospace; line-height:21px; word-wrap:normal; word-break:normal"><span style="line-height:normal; word-wrap:normal; word-break:normal">Android下,对于动态加载的库(dlopen(lib)),使用绝对路径就可以解决问题。</span></span><br><span style="font-family:monospace; line-height:21px; word-wrap:normal; word-break:normal"><span style="line-height:normal; word-wrap:normal; word-break:normal">对于动态链接(系统加载)的动态库,因为没有LD_LIBRARY_PATH方式,则可以采用在Activity的静态模块中使用System.LoadLibrary()方式提前加载于内存空间。</span></span><br></span><span></span> <div> <br><div><wbr>static<br> {</wbr></div> <div><wbr><span></span><wbr><span></span>System.loadLibrary("gnustl_shared");<wbr></wbr></wbr></wbr></div> <div><wbr><span></span><wbr><span></span>System.loadLibrary("testcplus");<wbr><span></span><wbr><wbr></wbr></wbr></wbr></wbr></wbr></div> <div><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span>System.loadLibrary("hello-jni");</wbr></wbr></wbr></wbr></div> <div><wbr><span></span><wbr><span></span><wbr><span></span><wbr><wbr></wbr></wbr></wbr></wbr></wbr></div> <div>}<br><br><br><strong><span style="color:rgb(153,0,48); line-height:21px; word-wrap:normal; word-break:normal">3. 复杂情况下NDK动态库的组织</span></strong>:<br> 使用上面所说的方法,可以解决非常简单的动态加载的动态库。但对于比较复杂的动态库。则有很多问题。<br> 例如:某些动态库有很多全局变量,且包含一些状态信息。<br> 而Activity在onDestory()后,进程并未完全退出。此时,动态库依然存在于内存之中。此时,再次运行应用程序。全局变量和状态还是使用之前的值。这会对逻辑造成很大困难。<br><br><br> 于是采用如下方式:<br><br><strong>首先:Java程序使用System.LoadLibrary()仅调用C++库(lib<span style="line-height:21px; word-wrap:normal; word-break:normal">gnustl_shared.so</span>)以及一个非常干净简单的动态库A。</strong> </div> <div> <br><strong><span style="color:rgb(153,0,48); line-height:21px; word-wrap:normal; word-break:normal">此动态库A</span></strong>,提供2个主要功能。Init(), UnInit().<br> 在Init()中,它作两件事:<br><strong>1. 采用dlopen()方式将所有动态链接(系统加载)的库(如上面所说引擎)加入内存(关键点)</strong> </div> </div> <strong>2. 采用dlopen()方式将需要dlopen() 的模块(如游戏逻辑)加入。<br><br> 在UnInit()中。依次dlclose();</strong><br><br><br><br><br><br><br><span>其次,动态库A所dlopen()的游戏逻辑动态库,直接使用函数名而非dlopen,dlsym的方式使用符号。这样,Linux下的代码,就不需要做任何修改即可。</span><br><br><span>在NDK 编译游戏逻辑时,指明</span><span>LOCAL_SHARED_LIBRARIES := 引擎。<br></span><span><br><br> 也就是说:System.LoadLibrary(A),将最简单的壳子动态库加入内存。<br><br> 此壳子动态库A在onCreate()时调用dlopen将所有所需动态库加入内存(引擎,游戏)。<br> 在onDestory()时,则dlclose(),将动态库移出内存。<br><br> 而在循环中,游戏动态库被dlopen,dlsym取出相应几个有限的符号并调用。<br><br> 而在这些符号内,他们直接使用引擎提供的函数。因为此时引擎已经被加载入内存。所以可以使用。<br><br><br> dlclose时,游戏和引擎都被移出内存。<br><br><br> (注:有很多游戏,但引擎只有一个,游戏使用此共同的引擎提供的函数)<br><br><br><br><br><br><strong><span style="color:rgb(153,0,48); line-height:21px; word-wrap:normal; word-break:normal">第三方C++库的移植</span>:</strong><br> 在开发Android大型程序时,不可避免要用到很多第三方OpenSouce.而大多数第三方库采用AutoConfig,或者CMake等特定编译工具编译。现在就说说如何利用NDK将其编译成咱们能够使用的静态库或者动态库。<br><br> 现在以xiph-ogg为例,演示如何使用NDK编译这些第三方库。<br><br><strong>0. 准备工作:</strong><br> 下载xiph source code.<br> 要编译的内容是:<br> xiph/ogg:生成libogg.so或者libogg.a<br> xiph/vorbis: 生成libvorbisfile.so <wbr>libvorbis.so 或者对应.a .<br><br><strong>1. 确定库所包含的源文件:</strong><br> 编译libogg.so,需要编译的源文件包括:<br> bitwise.c framing.c<br><br><br><strong>2.组织文件和写Android.mk+Application.mk</strong><br> Sam作如下目录结构:<br> xiph/ogg/jni/<br></wbr></span><span></span> <div> <span style="text-align:left; line-height:21px; background-color:rgb(255,255,255); word-wrap:normal; word-break:normal">这里包含4个文件:<wbr>bitwise.c framing.c, Android.mk, Application.mk<br><br> 作Android.mk如下:注意需要填写的资源文件(两个.c)以及<strong>指定-I目录</strong>。<br></wbr></span> <div><span style="text-align:left; line-height:21px; background-color:rgb(255,255,255); word-wrap:normal; word-break:normal">LOCAL_PATH := $(call my-dir)</span></div> <div><br></div> <div>include $(CLEAR_VARS)</div> <div>LOCAL_ARM_MODE := arm</div> <div>LOCAL_MODULE := ogg</div> <div>LOCAL_SRC_FILES := bitwise.c framing.c</div> <div>LOCAL_CXXFLAGS :=</div> <div>LOCAL_CFLAGS += -I<strong>/opt/Android-NDK/android-ndk-r8b/samples/xiph/xiph/ogg/include</strong> </div> <div>#LOCAL_SHARED_LIBRARIES := <wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr> </div> <div>LOCAL_LDLIBS := -llog</div> <div>#include $(BUILD_EXECUTABLE) <wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr> </div> <div>include $(BUILD_SHARED_LIBRARY)</div> <div>#include $(BUILD_STATIC_LIBRARY)<wbr><br><br></wbr> </div> </div> <span>编译之:<br> ../../../../../ndk-build -B V=1<br> 在xiph/ogg/libs/armeabi-v7a/下生成libogg.so<br><br><br><br> libvorbisfile.so <wbr>libvorbis.so的建立也一样,Android.mk如下:<br></wbr></span><span></span> <div><span style="text-align:left; line-height:21px; background-color:rgb(255,255,255); word-wrap:normal; word-break:normal">LOCAL_PATH := $(call my-dir)</span></div> <div><br></div> <div>include $(CLEAR_VARS)</div> <div>LOCAL_ARM_MODE := arm</div> <div>LOCAL_MODULE := vorbis</div> <div>LOCAL_SRC_FILES := mdct.c smallft.c block.c envelope.c window.c lsp.c lpc.c <wbr>analysis.c synthesis.c psy.c info.c floor1.c floor0.c \</wbr> </div> <div><wbr>res0.c mapping0.c registry.c codebook.c sharedbook.c lookup.c bitrate.c</wbr></div> <div>LOCAL_CXXFLAGS :=</div> <div>LOCAL_CFLAGS += -I/opt/Android-NDK/android-ndk-r8b/samples/xiph/xiph/ogg/include</div> <div>LOCAL_CFLAGS += -I/opt/Android-NDK/android-ndk-r8b/samples/xiph/xiph/vorbis/include</div> <div>LOCAL_CFLAGS += -I/opt/Android-NDK/android-ndk-r8b/samples/xiph/xiph/vorbis/lib</div> <div><br></div> <div>LOCAL_LDLIBS := -lm</div> <div>LOCAL_LDLIBS += -logg</div> <div><br></div> <div>#LOCAL_SHARED_LIBRARIES := <wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr> </div> <div>LOCAL_LDLIBS += -llog</div> <div>LOCAL_LDLIBS += -L/opt/Android-NDK/android-ndk-r8b/samples/xiph/NDK_Build/ogg/libs/armeabi-v7a</div> <div>#include $(BUILD_EXECUTABLE) <wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr> </div> <div>include $(BUILD_SHARED_LIBRARY)</div> <div>#include $(BUILD_STATIC_LIBRARY) <wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr> </div> <div><br></div> <div><br></div> <div><br></div> <div><br></div> <div>include $(CLEAR_VARS)</div> <div>LOCAL_ARM_MODE := arm</div> <div>LOCAL_MODULE := vorbisfile</div> <div>LOCAL_SRC_FILES := vorbisfile.c</div> <div>LOCAL_CXXFLAGS :=</div> <div>LOCAL_CFLAGS += -I/opt/Android-NDK/android-ndk-r8b/samples/xiph/xiph/ogg/include</div> <div>LOCAL_CFLAGS += -I/opt/Android-NDK/android-ndk-r8b/samples/xiph/xiph/vorbis/include</div> <div>LOCAL_CFLAGS += -I/opt/Android-NDK/android-ndk-r8b/samples/xiph/xiph/vorbis/lib</div> <div><br></div> <div>LOCAL_LDLIBS := -lm</div> <div>LOCAL_LDLIBS += -logg</div> <div>LOCAL_LDLIBS += -lvorbis</div> <div><br></div> <div>#LOCAL_SHARED_LIBRARIES := <wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span>\</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr> </div> <div><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></div> <div>LOCAL_LDLIBS += -llog</div> <div>LOCAL_LDLIBS += -L/opt/Android-NDK/android-ndk-r8b/samples/xiph/NDK_Build/ogg/libs/armeabi-v7a</div> <div>LOCAL_LDLIBS += -L/opt/Android-NDK/android-ndk-r8b/samples/xiph/NDK_Build/vorbis/libs/armeabi-v7a</div> <div>#include $(BUILD_EXECUTABLE) <wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span>\</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr> </div> <div><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><span></span><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></div> <div>include $(BUILD_SHARED_LIBRARY)</div> <div>#include $(BUILD_STATIC_LIBRARY) </div> </wbr></wbr></wbr>