androidstudio cmakelist编译.cpp并且引用第三方库(2)

第二次用cmakelist编译了,依然有很多坑

参考了官方文档
https://developer.android.com/studio/projects/add-native-code.html

1.missing and no known rule to make it 问题

很蛋疼,就是一个很简单的.so路径不对。但是路径放哪儿对呢,要看项目的build.gradle中设置的lib文件夹在哪儿。当你没有设置时,默认是jniLibs文件夹,所以要把so放在这里面,但是如果你设置了,那就要把文件夹放在那个指定的目录下面,就是下面这个设置。

 sourceSets {
        main {
            jniLibs.srcDirs = ["libs"]
        }
    }

2.包含头文件的文件夹,引入一次即可

#include的文件夹
include_directories(${CURRENT_DIR}/src/main/jni/prebuilt/include)
include_directories(${CURRENT_DIR}/src/main/jni/include)

3.这次跟上一次还要不同的情况是,这次我需要用两个依赖库,然后生成两个工具库

然后我照葫芦画瓢,照之前的写,结果报了很多 cpp文件中的函数undefine
原因就出来链接库的时候,没有分开链接,正确链接如下,像下面这样,两个jni库,分别链接了两个库,这样这个错误就没了

#问题出在这儿,我是用了两个三方库,最后生成两个api库,就要写成两个链接
target_link_libraries(jnistblur_preview_api

                       stblur_preview_api

                       ${log-lib}
                       ${android_lib}
                        )
target_link_libraries(jnistblur_capture_api

                      stblur_capture_api

                       ${log-lib}
                       ${android_lib}
                        )

以下是完整的CMakeLists.txt文件,供参考

cmake_minimum_required(VERSION 3.4.1)

set(CURRENT_DIR ${CMAKE_SOURCE_DIR})
message("CURRENT_DIR:" ${CMAKE_SOURCE_DIR})

#include的文件夹
include_directories(${CURRENT_DIR}/src/main/jni/prebuilt/include)
include_directories(${CURRENT_DIR}/src/main/jni/include)

#此处可以通过多加几个addlibrary来针对多个cpp文件来生成多个.so文件
#它的用法跟Android.mk里的定义差不多
#需要留意,编译出来的文件放在\build\intermediates\cmake中,但是不用自己复制了,它会自动复制到
#jniLibs文件夹下
add_library(
    jnistblur_preview_api   SHARED
    ${CURRENT_DIR}/src/main/jni/com_sensetime_blur_BlurFilterLibrary.cpp
)

add_library(
    jnistblur_capture_api   SHARED
    ${CURRENT_DIR}/src/main/jni/com_sensetime_blur_BlurImageLibrary.cpp
)



#两个预编译好的库========================================================
add_library(stblur_preview_api  SHARED  IMPORTED)
set_target_properties(stblur_preview_api PROPERTIES IMPORTED_LOCATION
                     ${CURRENT_DIR}/src/main/jniLibs/${ANDROID_ABI}/libstblur_preview_api.so)
#日啊,什么情况,这里加了${CURRENT_DIR}报undefine函数,不加报missing
#已经发现这里这的问题所在,这个so必须是放在指定的系统的lib文件夹下,也就是build.gradle如果不指定,就必须
#放在jniLibs文件夹下,如果指定了lib的文件夹,就必须放在那个指定的文件夹下
add_library(stblur_capture_api  SHARED  IMPORTED)
set_target_properties(stblur_capture_api PROPERTIES IMPORTED_LOCATION
                     ${CURRENT_DIR}/src/main/jniLibs/${ANDROID_ABI}/libstblur_capture_api.so)




find_library(android_lib android)
find_library(log-lib  log )
#undefine问题出在这儿,我是用了两个三方库,最后生成两个api库,就要写成两个链接
target_link_libraries(jnistblur_preview_api

                       stblur_preview_api
                       
                       ${log-lib}
                       ${android_lib}
                        )
target_link_libraries(jnistblur_capture_api

                      stblur_capture_api

                       ${log-lib}
                       ${android_lib}
                        )

你可能感兴趣的:(androidstudio cmakelist编译.cpp并且引用第三方库(2))