之前說了使用別人提供的 so 的一種方法,不過由于是第一次做這樣的需求,難免會遇到一些問題,所以下面就是這幾天 NDK 開發中的一些問題總結,不過可能由于問題情況有限,可能錯誤分析原因不全面。
1.報錯信息: java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader ... couldn't find "libxxx.so"
- 原因分析:是對應的 so 加載時沒找到,所以可能是 so 放錯了地方
- 解決方案:在 app 的 build 文件下的 android 節點添加如下代碼:
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
2.報錯信息:dlopen failed: library "libc++_shared.so" not found
- 原因分析:對應的 so 包依賴的 libc++_shared.so 沒有找到
- 解決方案:在 Application.mk 中添加 APP_STL := c++_shared,官方是這么說的:默認情況下,NDK 構建系統為 Android 系統提供的最小 C++ 運行時庫 (system/lib/libstdc++.so) 提供 C++ 標頭。 此外,它隨附您可以在自己的應用中使用或鏈接的替代 C++ 實現。請使用 APP_STL 選擇其中一個。 如需了解有關支持的運行時及其功能的信息,請參閱 NDK 運行時和功能。
3.報錯信息:
image.png
- 原因分析:項目總存在 c++ 代碼,而你的項目還不支持,你需要進行相應的配置
- 解決方案:進行 .mk 文件配置
4.報錯信息:'string' file not found
- 原因分析:因為我自己的是 .c 文件,而對方 .h 文件中涉及到 c++ 的用法
- 解決方案:將自己的 .c 文件后綴改為 .cpp,并在 Application.mk 文件中 添加 APP_STL := c++_shared,還需要讓自己的代碼被包起來,因為你要使用到 c++ 語法:
image.png
5.報錯信息:報錯信息:Error:(13) undefined reference to 'xxx方法'
- 原因分析:沒有正確的應用到方法
- 解決方案:在自己的 JNI 模塊中添加 LOCAL_ALLOW_UNDEFINED_SYMBOLS := true
6.報錯信息:java.lang.UnsatisfiedLinkError: dlopen failed: "/data/app/.../xxx..so" has unexpected e_type: 1
- 原因分析: LSB relocatable 這種類型的并不是正確 so 文件, LSB shared object 才是真正的共享庫(通過 file xxx.so 查看該信息)
- 解決方法:讓提供 so 包的人重新提供
7.報錯信息:No implementation found for int 包名.類名.方法名() (tried Java_包名類名方法名 and Java_包名類名方法名__)
- 原因分析:沒有對應的方法,可能是沒有進行 load 或者命名不符合規范
- 解決方法:我這里是忘記了 loadLibrary,當然使用 c++ 語法時也有可能會出這種問題
8.報錯信息:dlopen failed: library "工程目錄下的xxx.so" not found
- 原因分析:這是別人幫解決的,問題還是出的 so 編譯不正確
- 解決方法:對方編譯 so 加上 -soname,如果還不行,可能還是缺一些其他信息