使用android ndk r8 編譯nativc C,生成動態庫。並連接使用


使用android ndk r8 編譯nativc C,生成動態庫。並連接使用

#今天我講解的是如何使用Android.mk文件加上android ndk來編譯一個可以加載動態庫的命令。
  我用到的實例是math。目的是把double.c trip.c編譯成double.so 再編譯main.c並連接到double.so
  其中要用到三個文件,分別是double.c trip.c main.c  各文件的內容如下:
  /* main.c */
 #include<stdio.h>
 #include<math.h>
 int main()
 {   extern double dou();
  extern double trip();
  double x,y,z;
  puts("Enter a number please:");
  scanf("%lf",&x);
  y=dou(x);
  z=trip(x);
  printf("doub of the number is: %lf\n",y);
  printf("trip of the number is: %lf\n",z);
  printf("the sqrt of the trip is %lf\n",sqrt(z));
  return 0;   }
   ###########
   /*double.c */
   #include<stdio.h>
   double dou( double n)
   {   return n*n;
   }
   #########
   /*trip.c */
   #include<stdio.h>
   double trip(double n)
   {
   return n*n*n;
   }
   ######
   下面的文件是最重要的:Android.mk
   # build the math module for android
   LOCAL_PATH := $(call my-dir)
   include $(CLEAR_VARS)   #聲名模塊的開始
   LOCAL_MODULE := double  #生成的模塊名稱是double
   LOCAL_SRC_FILES := double.c trip.c  #編譯要用以的源代碼文件
   LOCAL_EXPORT_LDLIBS:= -llog #連接要用到的注冊庫(liblog.so),為下面的編譯做准備
   include $(BUILD_SHARED_LIBRARY)  #編譯生成動態的庫文件lib$(LOCAL_MODULE).so

   include $(CLEAR_VARS)
   LOCAL_MODULE :=math
   LOCAL_SRC_FILES :=main.c
   LOCAL_SHARED_LIBRARIES :=double m   #聲名需要連接的庫文件分別是,上面編譯的libdouble.so libm.so   
   include $(BUILD_EXECUTABLE)   #生成可以執行的文件$(LOCAL_MODULE)
   ########################
   現在對編譯的工具的位置說明一下:
   我把編譯工具放置在/home/sn/android-ndk-r8目錄里面。
   編譯源代碼的目錄是/home/sn/code/learning-c
   真正的源代碼放置位置是/home/sn/code/learning-c/jni
   編譯的時候,主要在jni的上層目錄進行,即是learning-c目錄,
   我在終端的目錄顯示為如下:
   root@sn-workshop:/home/sn/code/learning-c#
   我把以上的目錄簡寫為$(PROJECT), {  即為我定義為有如下的規則PROJECT=/home/sn/code/learning-c
   所以我的編譯命令就是如下所示:
   $(PROJECT) http://www.cnblogs.com/android-ndk-r8/ndk-build
   編譯器運行的時候得到如下信息輸出:
   Compile thumb  : double <= double.c
   Compile thumb  : double <= trip.c V -
   SharedLibrary  : libdouble.so
   Install        : libdouble.so => libs/armeabi/libdouble.so
   Compile thumb  : math <= main.c
   Executable     : math
   Install        : math => libs/armeabi/math
   --------------------------
   上面顯示的信息如圖所示:
   #加入圖片
   能顯示以上的信息,證明已經編譯成功了。
   下面用cd命令進入生成math和libdouble.so文件目錄,命令如下:
   $(PROJECT) cd ./libs/armeabi
   查看當前目錄的文件是否存在:
   $(PROJECT)/libs/armeabi#ls  #顯示
   libdouble.so math
   -----------------
   現在使用arm-linux-androideabi-readelf命令查看一下,math命令需要哪些動態庫文件(*.so)文件。
   其中這個arm-linux-androideabi-readelf是你從android ndk r7(r8)的源代碼程序中,提取出來的單獨的toolchain,
   並把得到的toolchain加入到環境中去。
   真正的命令如下所示:
   $(PROJECT)libs/armeabi#arm-linux-androideabi-readelf -d math #其中的選項"-d",目的是顯示加載的動態庫
   顯示的內容如下:
   -------------------------------------
   Dynamic section at offset 0x2490 contains 26 entries:
   Tag                Type              Name/Value
   0x00000001            (NEEDED)        Shared library: [libdouble.so]
   0x00000001            (NEEDED)        Shared library: [liblog.so]
   0x00000001            (NEEDED)        Shared library: [libstdc++.so]
   0x00000001            (NEEDED)        Shared library: [libm.so]
   0x00000001            (NEEDED)        Shared library: [libc.so]
   0x00000001            (NEEDED)        Shared library: [libdl.so]
   0x00000020            (PREINIT_ARRAY) 0X12470
   0X00000021            (PREINIT_ARRARYSZ) 0x8
   ---------------------  下面是實際的操作:
   下面用adb push命令把生成的兩個文件push到手機目錄 ,前提是你的linux系統已經正確配置adb,
   還有你的手機已經root
   要用到的命令如下:
   adb push math /system/math  #把生成的文件push到手機的/system目錄下面去
   adb push libdouble.so /system/lib/libdouble.so  #把生成的libdouble.so文件push到/system/lib目錄去,
   因為這個目錄是動態庫文件放置的地方。
   #注意當沒有把libdouble.so文件復制到/system/lib目錄的時候會出現如下的錯誤:
   Link_image[1962]: 726 could not load needed library 'libdouble.so' for './math' (Load_library[1104]:
   Library 'libdouble.so' not found)CANNOT LINK EXECTABLE
   繼續輸入如下的命令:(‘#’后面是解釋詞)
   adb shell        #進入手機的調試終端
   #如果你的手機是從內核得到權限的,會顯示這個提示符#
   $                #如果你的手機是沒有從內核得到權限的,就會顯示這個提示符,
   當出現$提示符的時候,再輸入su,再在手機的屏幕上面按確定就行了。
   .  再用如下的命令:
   #cd /system        #進入/system目錄,
   # ls math            #查看當前目錄是否有math文件,
   #./math               #運行math程序, `
   Enter a number please
   4
   double of the numbe is : 16.000000
   trip of the numbe is   :64.000000
   the sqrt of the trip is 8.000000
   #                #程序運行完成后,返回命令行的終端模式。
   #exit            #退出調試終端。
   以上就是全部了。
   今天的教程到此為止。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM