终于解决困扰了我2天的问题!!!那叫一个激动!!
最近做一个项目,需要在同一个模块中同时生成两个SO文件,刚开始没觉得怎么样,就在一个CMakeLists.txt文件这么写入:
cmake_minimum_required(VERSION 3.4.1)
# 这是第一个so
add_library(
a-lib
SHARED
a.cpp
)
# 这是第二个so
add_library(
b-lib
SHARED
b.cpp
)
find_library(
log-lib
log
)
# 链接
target_link_libraries(
a-lib
b-lib
${log-lib}
)
AS的确帮我生成了2个so,用起来也没有问题,一切显得很正常,不过只是表象。
OK,接下来我需要在第二个so中打印时间,测试效率,so我在b.cpp中引入#<android/log.h>,使用print:
#include <android/log.h>
#define TAG "LOGGER"
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, TAG, __VA_ARGS__)
void doSomething() {
...
LOGE("time --- ");
...
}
保存,编译,结果出现:
undefined reference to '__android_log_print'
然后我检查了很久CMakeLists.txt文件是否写错,结果调试了很久,又上网百度了很久,不得而解!我就纳闷了,就这样半天就过去,心情down到冰点!
另辟蹊径,新建了一个模块,单独把b.cpp文件拿出来,在新的模块中进行调试,没想到编译竟然通过了,运行也没有问题,这我才意识到,估计是哪里有冲突(目前我对C的编译还不是很熟悉,知道为什么的朋友麻烦告知一下)!
知道问题就好解决了,百度一下怎么在一个模块同时生成2个so的方法,参考 Android Studio NDK CMake 指定so输出路径以及生成多个so的案例与总结,最后成功。虽然成功,不过这篇博客还是有点问题的,下面说说我集成的过程。
首先看看我的项目某个模块的结构:
我们cpp下分了2个子文件夹,每个子文件都有自己的cpp源文件和CMakeLists.txt,这里注意了,每生成一个SO都需要一个CMakeLists.txt文件。
我们主要看CMakeLists.txt内容:
# 模块下CMakeLists.txt
# 指定版本
cmake_minimum_required(VERSION 3.4.1)
# 这里与参考博客不一样
# 添加子文件夹
ADD_SUBDIRECTORY(src/main/cpp/gles)
ADD_SUBDIRECTORY(src/main/cpp/yuv)
# cpp/gles/CMakeLists.txt
# 这里不再需要 cmake_minimum_required
add_library(
gles-lib
SHARED
gles-lib.cpp
)
find_library(
log-lib
log
)
target_link_libraries(
gles-lib
${log-lib}
)
# cpp/yuv/CMakeLists.txt
# 这里不再需要 cmake_minimum_required
add_library(
yuv-lib
SHARED
yuv-lib.cpp
)
find_library(
log-lib
log
)
target_link_libraries(
yuv-lib
${log-lib}
)
编译,就可以在build文件夹看到生成的so文件:
虽然问题很小,却困扰我许久,看来我还得加强在NDK方面的知识!