Android入門筆記12

AnalogElectronic發表於2020-10-21

交叉編譯

  • 在一個平臺下,編譯出另一個平臺能夠執行的二進位制的程式碼
  • 平臺:windows,mac os,linux
  • 處理器:x86,arm,mips

交叉編譯的原理

  • 原始碼->編譯->連結->可執行程式
  • 模擬其他平臺的特性

交叉編譯的工具鏈

  • 多個工具的集合,一個工具使用完後接著呼叫下一個工具

常見工具

  • NDK:native developement kit:開發jni必備,就是模擬其他平臺特性來編譯程式碼的工具
  • CDT:C/C++ developement tools:高亮顯示c語言關鍵字
  • cygwin:一個模擬器,可以再windows下執行linux指令

NDK目錄結構

  • docs:幫助文件
  • build/tools:linux的批處理檔案
  • platforms:編譯c程式碼需要使用的標頭檔案和類庫
  • prebuilt:預編譯使用的二進位制可執行檔案
  • sample:jni的使用例子
  • source:ndk的原始碼
  • toolchains:工具鏈
  • ndk-build.cmd:編譯打包c程式碼的一個指令

使用jni

  1. 在專案根目錄下建立jni資料夾

  2. 在jni檔案中建立一個c檔案

  3. 在java程式碼中,建立一個本地方法helloFromC

     public native String helloFromC();
    
  4. 在jni中定義函式實現這個方法,函式名必須為

     jstring Java_com_itheima_helloworld1_MainActivity_helloFromC(JNIEnv* env, jobject obj)
    
  5. 返回一個字串,用c定義一個字串

     char* cstr = "hello from c";
    
  6. 把c的字串轉換成java的字串

     jstring jstr = (*env)->NewStringUTF(env, cstr);
     return jstr;
    
  7. 在jni中建立Android.mk檔案

  8. 在c檔案中新增<jni.h>標頭檔案

  9. 在jni資料夾下執行ndk-build.cmd指令

  10. java程式碼中載入so類庫,呼叫本地方法

常見錯誤

  • findLibrary returned null

    • CPU平臺不匹配
    • 載入類庫時,寫錯類庫名字
  • 本地方法找不到

    • 忘記載入類庫
    • c程式碼中方法名寫錯了

javah

*1.7:在src目錄下執行javah 包名.類名
*1.6:在bin/classes目錄下執行

javap

  • 在bin/class目錄下執行javap -s 包名.類名
    • 列印方法簽名

C向C++改造

  1. 把c檔案字尾名換成cpp
  2. Android.mk檔案中的hello.c也要換成hello.cpp
  3. c++的使用的環境變數結構體中,訪問了c使用的結構體的函式指標,函式名全部都是一樣的,只是引數去掉了結構體指標
  4. 訪問函式指標時,把env前面的*號去掉,因為此時env已經是一級指標
  5. clean,清除之前編譯的殘留檔案
  6. 把宣告函式的h檔案放入jni資料夾中,include該h檔案

相關文章