美文网首页
androidstudio cmakelist编译.cpp并且引

androidstudio cmakelist编译.cpp并且引

作者: miniminiming | 来源:发表于2018-03-23 17:11 被阅读0次

    第二次用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并且引

          本文链接:https://www.haomeiwen.com/subject/srpxcftx.html