【轉】如何把ndk編譯出來的可執行檔偽裝成so打包到apk中

來源:互聯網
上載者:User

標籤:

原文網址:http://jeyechao.iteye.com/blog/2164286

ndk編譯出來的共用庫,eclipse會自動打包到apk中,而編譯出來的可執行檔則不會。

要想可執行檔自動被打包到apk中,可以把檔案名稱改成libxxx.so的形式,偽裝成so,這樣就會被打包進apk。

但是每次編譯之後都改一下名字,太麻煩!

寫個指令碼吧,又有arm, armv7, x86的麻煩事!

想試著改LOCAL_MODULE_FILENAME來試試,NDK又不允許。

於是稍微看了下NDK的編譯指令碼,發現如下解決辦法。

NDK是通過在Android.mk檔案中include $(BUILD_EXECUTABLE)來編譯可執行檔,其實就是調用了一個已經寫好的指令碼——build-executable.mk。(編譯指令碼都在NDK_ROOT/build/core目錄裡面)

仔細看指令碼的調用過程可以發現,指令碼一開始先檢查一下變數合法性(前面改LOCAL_MODULE_FILENAME的方法在這裡過不去),最終調用include$(BUILD_SYSTEM)/build-module.mk來編譯。

於是研究這個指令碼,找到決定編譯輸出的變數,在調用最終的編譯指令碼之前改成想要的就可以了。

 

最終我的方案如下:

1. 為了不破壞ndk本來的指令碼,將build-executable.mk拷貝一份放在自己的工程目錄下面,在倒數第三行插入一句 $(evalLOCAL_BUILT_MODULE := $(TARGET_OUT)/$(MY_LOCAL_MODULE_FILENAME))

2. 在自己的Android.mk檔案中定義MY_LOCAL_MODULE_FILENAME變數,當然值就是你想要的檔案名稱啦

3. 編譯時間不調用系統的include$(BUILD_EXECUTABLE), 而改調用自己的指令碼(就是上面拷貝出來且做了修改的那個指令碼),為了方便,你可以給自己的指令碼定義一個變數來指向它。

 

就是這樣。

寫得比較亂,貼幾段關鍵代碼吧。

修改後的build-executable.mk代碼。

 

Xml代碼  
  1. LOCAL_BUILD_SCRIPT := BUILD_EXECUTABLE  
  2. LOCAL_MAKEFILE     := $(local-makefile)  
  3.   
  4. $(call check-defined-LOCAL_MODULE,$(LOCAL_BUILD_SCRIPT))  
  5. $(call check-LOCAL_MODULE,$(LOCAL_MAKEFILE))  
  6. $(call check-LOCAL_MODULE_FILENAME)  
  7.   
  8. # we are building target objects  
  9. my := TARGET_  
  10.   
  11. $(call handle-module-filename,,)  
  12. $(call handle-module-built)  
  13.   
  14. $(eval LOCAL_BUILT_MODULE := $(TARGET_OUT)/$(MY_LOCAL_MODULE_FILENAME))  
  15.   
  16. LOCAL_MODULE_CLASS := EXECUTABLE  
  17. include $(BUILD_SYSTEM)/build-module.mk  

 14行就是我們加的那一行。

 

 上面的檔案放在jni根目錄,跟目錄下的Android.mk代碼:

Xml代碼  
  1. MY_BUILD_EXECUTABLE := $(JNI_ROOT)/build-executable.mk  
  2. include $(call all-subdir-makefiles)  

 

 需要編譯可執行檔的模組這樣寫:

Xml代碼  
  1. LOCAL_PATH := $(call my-dir)  
  2. include $(CLEAR_VARS)  
  3.   
  4. LOCAL_SRC_FILES := ...  
  5. LOCAL_MODULE := xxx  
  6. MY_LOCAL_MODULE_FILENAME := libxxx.so  
  7. LOCAL_C_INCLUDES := ...  
  8. LOCAL_LDLIBS:=-L$(SYSROOT)/usr/lib -llog  
  9. LOCAL_CFLAGS := -fPIC  
  10.   
  11. include $(MY_BUILD_EXECUTABLE)  

 OK, 大功告成!

【轉】如何把ndk編譯出來的可執行檔偽裝成so打包到apk中

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.