【CMake】Android native模块a调用native模块b,如何配置cmake?

文章目录

Android项目中如何配置cmake,让module a的native代码调用module b的native代码?

打印路径

首先可以看看CMAKE_SOURCE_DIR的具体路径:

c 复制代码
message("CMAKE_SOURCE_DIR :" + ${CMAKE_SOURCE_DIR})

定义子目录的路径

c 复制代码
set(MODULE_A_DIR   ${CMAKE_SOURCE_DIR}/../../../../module-a/src/main/cpp)
message("MODULE_A_DIR :" + ${MODULE_A_DIR})

把子模块的cmakelists添加关联

接着根据自己项目的具体位置,找到实际上module a的代码路径。接着调用add_subdirectory,添加到对应的路径中。

add_subdirectory的主要作用是添加另外一个cmakelist到当前的cmakelisk的搜索目录中。

参考doc:https://cmake.org/cmake/help/latest/command/add_subdirectory.html

c 复制代码
add_subdirectory( ${MODULE_A_DIR}  ${MODULE_A_DIR}/build)

这里需要注意的是,这种情境下使用add_subdirectory,它的第二个参数需要声明对应的build 后二进制文件的具体路径,不然无法编译链接通过。

添加源码文件搜索路径

c 复制代码
include_directories(${MODULE_A_DIR})

参考doc:https://cmake.org/cmake/help/latest/command/include_directories.html

添加库的链接

到这里,需要把子module的库链接到主module,才能编译运行:

c 复制代码
target_link_libraries(${CMAKE_PROJECT_NAME}
        # List libraries link to the target library
        android
        module_a
        log)

测试

子module

test.h

c 复制代码
//
// Created by linshujie on 2024/3/18.
//

#ifndef CMAKEDEMO_TEST_H
#define CMAKEDEMO_TEST_H



//add cplusplus flag
#ifdef __cplusplus
extern "C" {
#endif

    void printnum(int a);

#ifdef __cplusplus
}
#endif


#endif //CMAKEDEMO_TEST_H

test.c

c 复制代码
//
// Created by linshujie on 2024/3/18.
//
#include "stdio.h"
#include "android/log.h"
void printnum(int a) {
//    printf("%d\n", a);
    __android_log_print(ANDROID_LOG_DEBUG, "linshujie", "%d", a);
}

JNI代码:

c 复制代码
#include <jni.h>
#include <string>
#include "test.h"

extern "C" JNIEXPORT jstring JNICALL
Java_com_linshujie_cmakedemo_MainActivity_stringFromJNI(
        JNIEnv* env,
        jobject /* this */) {
    std::string hello = "Hello from C++";
    printnum(1);
    return env->NewStringUTF(hello.c_str());
}

运行,成功打印。

代码链接:https://github.com/ShujieLin/cmakedemo

相关推荐
AI智能架构工坊16 小时前
提升AI虚拟健康系统开发效率:架构师推荐10款低代码开发平台
android·人工智能·低代码·ai
百锦再16 小时前
低代码开发的约束性及ABP框架的实践解析
android·开发语言·python·低代码·django·virtualenv·rxjava
那我掉的头发算什么17 小时前
【数据库】navicat的下载以及数据库约束
android·数据库·数据仓库·sql·mysql·数据库开发·数据库架构
明道源码18 小时前
Android Studio 应用运行到真机设备
android·ide·android studio
生莫甲鲁浪戴18 小时前
Android Studio新手开发第二十五天
android·ide·android studio
Varpb18 小时前
android studio-设置android模拟器屏幕自动旋转
android·android studio
2501_9151063219 小时前
iOS 打包 IPA 全流程详解,签名配置、工具选择与跨平台上传实战指南
android·macos·ios·小程序·uni-app·cocoa·iphone
超低空19 小时前
Android MediaSession深度解析:车载音乐播放器完整案例
android·架构·客户端
QmDeve19 小时前
Android 集成与使用模糊开关按钮视图 (BlurSwitchButtonView)
android·github
00后程序员张19 小时前
iOS 混淆实操指南多工具组合实现 IPA 混淆、加固与发布治理 IPA 加固
android·ios·小程序·https·uni-app·iphone·webview