JNI 同一个Module生成多个so

2 篇文章 0 订阅

终于解决困扰了我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方面的知识!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值