由於從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")
這樣應該就沒問題了, 如果執行時還有找不到庫的報錯, 按照同樣的方法添加對相應庫的依賴即可.