由於從Android 7.0, API 24, 開始, "系統將阻止應用鏈接至非公開NDK庫" , 所以, 使用libOpenCL.so時與面向低版本的Android平臺有所不同, 需要把依賴的非公開NDK庫打包到APK中 確定依賴的庫 首先應該確定你所使用的libOpenC.so所依賴的庫, 使用 ...
由於從Android 7.0, API 24, 開始, 系統將阻止應用鏈接至非公開NDK庫, 所以, 使用libOpenCL.so時與面向低版本的Android平臺有所不同, 需要把依賴的非公開NDK庫打包到APK中
確定依賴的庫
首先應該確定你所使用的libOpenC.so所依賴的庫, 使用命令objdump -x libOpenCL.so | grep NEEDED
,
這是在我的手機上面測試的情況, 那麼我們需要做的是從手機上面, 把這些庫全部pull出來, 然後打包到APK中. (在本例中, libc.so和libm.so是公開NDK庫, 可以不用打包, 所以下麵中沒有打包)
打包依賴庫
先是從手機/system/lib/
目錄下麵把這些庫pull出來, 然後把他們全部放到AndroidStudio工程的jniLibs
目錄下麵,
然後在CMakeLists.txt中添加這些庫
add_library(libOpenCL SHARED IMPORTED )
set_target_properties(libOpenCL PROPERTIES IMPORTED_LOCATION "${CMAKE_SOURCE_DIR}/src/main/jniLibs/armeabi-v7a/libOpenCL.so")
add_library(libcutils SHARED IMPORTED )
set_target_properties(libcutils PROPERTIES IMPORTED_LOCATION "${CMAKE_SOURCE_DIR}/src/main/jniLibs/armeabi-v7a/libcutils.so")
add_library(libvndksupport SHARED IMPORTED )
set_target_properties(libcutils PROPERTIES IMPORTED_LOCATION "${CMAKE_SOURCE_DIR}/src/main/jniLibs/armeabi-v7a/libvndksupport.so")
add_library(libc++ SHARED IMPORTED )
set_target_properties(libcutils PROPERTIES IMPORTED_LOCATION "${CMAKE_SOURCE_DIR}/src/main/jniLibs/armeabi-v7a/libc++.so")
這樣應該就沒問題了, 如果執行時還有找不到庫的報錯, 按照同樣的方法添加對相應庫的依賴即可.