zoukankan      html  css  js  c++  java
  • NDK动态库的调用

      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

         

     


     


  • 相关阅读:
    过滤器
    HTTP会话的使用和管理
    Servlet技术(下)
    Servlet技术(上)
    Web运作原理
    Tomcat简介
    Java Web应用
    java io
    【node.js】node.js安装yarn报错:Could not create the Java Virtual Machine
    【微信小程序】微信小程序页面url传参,使用JSON.parse报错Unexpected end of JSON input
  • 原文地址:https://www.cnblogs.com/zhangweia/p/1828176.html
Copyright © 2011-2022 走看看