博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

NDK动态库的调用

Posted on 2010-09-16 15:46  zhangweia  阅读(13111)  评论(2编辑  收藏  举报

  NDK动态库的调用分两种情况。第一种是:so库和调用程序在同一个目录和源程序 通过同一个mk文件来编译;另外一种情况是so是外部已经编译好了的,调用程序加载调用。下面我们就来分析下面2种so的调用情况:

第一部分: 内部so调用

      A. 先看下工程的目录:

          image     

          test01.java  :Java文件

          test01.c 主so,生成libtest.so,在libtest.so中调用libtutorial.so中的方法

          tutorial01.c tutorial02.c tutorial02.h :生成libtutorial.so

     B. 然后看下具体的mk文件的写法以及java中的文件内容

test01.java

Android.mk     

 

test01.c

tutorial01.c

 

 

tutorial02.c


 

tutorial02.h

C: 编译:

    进入工程目录,执行  $NDK/ndk-build

    输出结果:

$NDK/ndk-build

D:在重新刷新工程,你就可以在lib下面看到生成的so了,点击加载运行

 

第二部分:调用通过自己编写make方式生成的so

      我们还是引用上面的工程,不过把libtutorial.so 拿出来,通过自己写makefile来编译成so,这里请大家注意了,调用外部的so时候,不能够直接用在linux下生产的so来调用,必须通过ndk提供的gcc来编译,否则会因为平台的不同无法调用。

     A. 废话不多说,看makefile怎么写!我的ndk是1.6版本的.

         新建一个文件夹,把 tutorial01.c  tutorial02.c  tutorial02.h 文件拷贝过去,然后编写makefile文件

libtutorial.so Makefile

在执行make的时候需要注意一下几点:

1.  指定程序需要的头文件目录 通过-I指定/cygdrive/e/cygwin/android-ndk-r4/build/platforms/android-5/arch-arm/usr/include NDK提供的一些基本c语言库的头文件

2.  指定库路径-L/cygdrive/e/cygwin/android-ndk-r4/build/platforms/android-5/arch-arm/usr/lib 里面有libz.so,libm.so,libdl.so等库的路径

3.   拷贝交叉编译文件armelf.xsc到android-ndk-r4/build/prebuilt/windows/arm-eabi-4.4.0/lib/gcc/arm-eabi/4.4.0下,armelf.xsc在目录./build/prebuilt/linux-x86/arm-eabi-4.4.0/arm-eabi/lib/ldscripts下

4.   拷贝libc.so到./build/prebuilt/linux-x86/arm-eabi-4.4.0/lib/gcc/arm-eabi/4.4.0目录下,libc.so位于./build/platforms/android-5/arch-arm/usr/lib库

完成上面的工作你就可以放心make了,成功后生成libtutorial.so文件


 

libtest.so Makefile

B. 生成so文件后,在工程目录下建立目录libs/armeabi,然后把so拷贝进去,在打开工程,刷新加载,一切搞定

C.  一些小技巧:

    a. 查看so是不是编译成ARM模式下的so

         $ file libtest.so
         libtest.so: ELF 32-bit LSB shared object, ARM, version 1 (SYSV), dynamically linked, not stripped

    b.  如果别人提供了你一个so,查看提供了那些方法,更详细的用法,查看nm命令

$ nm libtutorial.so |grep T
00001344 a _GLOBAL_OFFSET_TABLE_
000002a8 T getinformation
000002b4 T getinformation2

D.  下面提供一个大工程的编译的makefile,吧opencore --omx下的testapp独立编译成so,编译通过,未加载库,给大家参考。

testapp Makefile