實現jni中遇到的問題

之前,記錄了實現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中)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章