以下只是自己的一些總結,歡迎討論
通過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進行編譯
