之前,記錄了實現jni的過程——android studio中實現jni開發
實現過程並不是一帆風順的,這裏記錄一下遇到的問題。
1、Ndk-build時
錯誤提示:“parameter name omitted”。
大意是“參數名被忽略”。
頭文件中函數聲明參數列表中只有參數類型,沒有參數名。而我們是直接複製頭文件的內容,所以這裏應該添加參數名。如下所示:
然後繼續執行ndk-build
可以看到,在libs目錄下已經生成了so文件。證明編譯已經ok了。
2、編寫Android.mk文件
》LOCAL_MODULE := sec_fleet
用於聲明編譯的模塊,可以自定義名字,名稱必須唯一且不含任何空格
Build System在生成最終共享庫文件時,會將"lib"作爲前綴+模塊名稱+".so"作爲共享庫文件名稱;
如:libsec_fleet.so
》LOCAL_SRC_FILES
此變量必須包含要構建到模塊中的C/C++源文件列表,不需要列出頭文件和包含文件,系統會自動導入依賴。
此變量包含構建共享庫或可執行文件時鏈接庫,使用-l前綴傳遞特定系統庫的名稱,多個鏈接庫之間使用空格作爲分隔符;
NDK爲Android版本提供新的頭文件和庫,文件路徑:$NDK/platforms/android-<level>/<abi>/usr/include下;
-llog鏈接到系統的liblog.so文件,應用可以定義從原生代碼向內核發送日誌消息,路徑:/system/lib/liblog.so,其實是導入<android/log.h>頭文件,路徑:$NDK/platforms/android-3/arch-arm/usr/include/android/log.h
變量列表:
-llog(日誌庫):導入log.h頭文件
-lz(ZLib壓縮庫):添加zlib.h和zconf.h頭文件;
-ldl(動態鏈接器庫):添加dlfcn.h頭文件,可以訪問Android動態鏈接器的dlopen()、dlsym()和dlclose()函數;
3、Application.mk文件
APP_MODULES := sec_fleet
APP_MODULES:默認情況下,Android NDK構建系統 構建Android.mk文件聲明的所有模塊。
該變量可以提供一個空格分開的,需要被構建的模塊列表
4、在c文件中打印日誌
打印日誌聲明如下:
結果一直打印的地方一直報錯。
解決:
一定要在在Android.mk中加入
LOCAL_LDLIBS := -llog
5、把其他項目中用到的jni文件複製到當前項目的module下,編譯時報錯
C:\Users\Administrator\AppData\Local\Android\Sdk\ndk-bundle\build\ndk-build.cmd
Android NDK: APP_PLATFORM not set. Defaulting to minimum supported version android-16.
C:/Users/Administrator/AppData/Local/Android/Sdk/ndk-bundle/build//../build/core/add-application.mk:88: *** Android NDK: Aborting... . Stop.
Android NDK: WARNING: APP_PLATFORM android-16 is higher than android:minSdkVersion 1 in ./AndroidManifest.xml. NDK binaries will *not* be compatible with devices older than android-16. See https://android.googlesource.com/platform/ndk/+/master/docs/user/common_problems.md for more information.
Android NDK: Your APP_BUILD_SCRIPT points to an unknown file: ./jni/Android.mk
很明顯,是路徑找不到的問題。
因爲之前配置的ndk-build命令,我們指定的WorkDirctory爲workspace所在的路徑——$ProjectFileDir$\app\src\main
而我們當前是放在module中的,所以路徑也就變成了
F:\project\work\AppFleet_Android\httplibrary\src\main\jni
區別原來的:F:\project\work\AppFleet_Android\app\src\main\jni
怎麼辦呢?
那就在dos窗口中使用命令行來編譯好了,如下:
切換到對應的路徑下,使用ndk-build命令,前提是在環境變量中配置了NDK_HOME,
然後,如上圖所示,編譯成功了。
回到android studio中,可以看到如下:
已經生成了需要的so文件。
6、接着5,編譯好so之後,接着運行項目,遇到問題:
意思:您的項目包含C++文件,但它沒有使用受支持的native編譯系統。
解決辦法:
在當前module的build.gradle中加入如下配置即可。(這個配置也可以放在defaultConfig中)。