在Android源碼下編譯jni所需要知道的事~


以下只是自己的一些總結,歡迎討論 

通過NDK編譯jni網上有很多例子,在這我只總結在Android源碼下編譯 

1、android源碼環境下編譯so包,編出來的.so的包前面不會自動給添加lib,NDK編譯會自動給添加lib,即使Android.mk文件里面LOCAL_MODULE :=名字前面沒有lib,NDK也會自動給你添加lib. 所以NDK編譯時Android.mk文件編譯出來的so包名字可以加lib也可不加,但源碼下編譯必須加 


2、系統應用和用戶應用的區別 

   在package/app下的工程 編譯后生成的apk都會在system/app下 將系統 燒錄到手機后 這些apk都會作為系統應用,系統應用所使用到的.so庫全部在system/lib下面,若沒有則會出錯。這就是為什么源碼下編譯jni生成的庫會放在out/target/product/xxxxxxxx_xx_m0/system/lib 
   用戶應用會默認到應用的data/data目錄的lib文件夾下找.so,如果找不到就會報錯誤。當前前提是你的系統system/lib下沒有同樣的so文件. 


3、adb push 與 adb install 區別 

   adb push 能夠指定安裝目錄。比如執行"adb push xxx.apk system/app" 后,xxx.apk被安裝到了system/app目錄下。 這時候就是系統應用 
   adb install 用此命令安裝的軟件位於 data/app 目錄,則為user application。 


4、當我們修改系統應用中的jni文件,你刷機后,系統的system/lib下就有你需要的so文件了。如果你不想刷機,你也可以通過adb push *.so \system\lib的方式,將*.so放到system\lib下,以供調用,因為不刷機系統中的system/lib下並沒有剛才生成的.so 


5、如果我們沒有jni文件只有.so的話,系統應用因為需要在system/lib下調用.so,所有我們就需要在編譯的時候將這個.so文件預置到out/target/product/xxxxxxxx_xx_m0/system/lib中 
include $(CLEAR_VARS) 
LOCAL_MODULE := libfp_gf_mp 
LOCAL_SRC_FILES := ../libs/arm64-v8a/libfp_gf_mp.so 
LOCAL_MODULE_TAGS := optional 
LOCAL_MODULE_SUFFIX := .so 
LOCAL_PROPRIETARY_MODULE := true 
LOCAL_MODULE_CLASS := SHARED_LIBRARIES 
include $(BUILD_PREBUILT) 

6、直接使用.so 庫 步驟 
   1、第三方的so文件或者別人編譯好的so文件,你可以直接放到 libs/armeabi 下 

   2、在主文件夾的Android.mk中加上依賴    LOCAL_JNI_SHARED_LIBRARIES :=      libuserbookpatcher_jni 

   3 、如果是系統應用則要在jni的Android.mk中將.so文件預置到system/lib中 

   注:在程序中用jni文件生成.so不用進行預置,因為會直接生成到里面system/lib中  但是主文件夾的Android.mk中加上依賴  LOCAL_JNI_SHARED_LIBRARIES := libuserbookpatcher_jni 


7、在工程目錄的Android.mk中 最后加上 
# Use the folloing include to make our test apk. 
include $(call all-makefiles-under,$(LOCAL_PATH)) 
會將當前工程目錄所有子目錄中的Android.mk進行編譯 


免責聲明!

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



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