使用CMake引入第三方so库及头文件并调用头文件声明的函数

首先,要调用别人的so库和头文件,我们自己项目中需要有NDK。
因为只有C++代码才能直接调用C++代码,也就是头文件和so库的函数。

其次,就是要想办法把头文件,so库和项目中的NDK关联起来,然后作为一个整体,生成一个jni,供Java层调用。

最后,二者的关联是通过CMake完成的。

项目目录

一.具体讲解一下CMakeLists.txt写法

1.target_include_directories 将头文件与自己项目的ndk关联
注意是add,不是add/
add指的是cpp目录下的add文件夹
#将native-lib 关联到第三方库头文件 下面的路径是第三方头文件的路径

target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE
       add)

2.将第三方so库和自身项目的NDK关联

2.1 add_library将要导入的so库加入到library中,注意每个so库都分开导入

导入第三方库,不同的第三方库需要分开导入,有两个so库需要导入,所以写两次

add_library(testjni SHARED IMPORTED)
add_library(add-lib SHARED IMPORTED)

2.2.set_target_properties告诉CMake so库所在的路径
注意 网上说 ${CMAKE_SOURCE_DIR} 表示源代码的根路径,也就是E:/workas/jnitest/app,这样可以避免硬编码绝对路径。
但是实际打印出来发现#CMAKE_SOURCE_DIR===E:/workas/jnitest/app/src/main/cpp,以至于CMake找不到so库,报错。
具体原因未知,只能先硬编码
#第一个参数为第三方so库名称,第二个指明配置导入第三方so库路径,第三个为第三方库的具体路径
#CMAKE_SOURCE_DIR E:/workas/jnitest/app/src/main/cpp

set_target_properties(
        testjni
        PROPERTIES IMPORTED_LOCATION
#        ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${CMAKE_ANDRO
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Android Studio中引入第三方C++的步骤如下: 1. 将第三方的源代码放入项目的jni目录下,例如:`/app/src/main/jni/third_party_lib/`。 2. 在项目的`build.gradle`文件中添加以下代码: ```gradle android { // ... defaultConfig { // ... externalNativeBuild { cmake { cppFlags "-std=c++11 -frtti -fexceptions" abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64' } } } // ... } // ... externalNativeBuild { cmake { path "CMakeLists.txt" } } ``` 其中,`path`指定了CMakeLists.txt文件的路径,`cppFlags`指定了编译选项,`abiFilters`指定了支持的CPU架构。 3. 在项目的`CMakeLists.txt`文件中添加以下代码: ```cmake add_library(third_party_lib SHARED IMPORTED) set_target_properties(third_party_lib PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/third_party_lib/libthird_party_lib.so) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/third_party_lib/include) ``` 其中,`add_library`指定了的名称,`IMPORTED`表示这是一个外部,`IMPORTED_LOCATION`指定了文件的路径,`include_directories`指定了文件的路径。 4. 在JNI代码中调用第三方函数。 ```c++ #include "third_party_lib/include/third_party_lib.h" extern "C" JNIEXPORT jstring JNICALL Java_com_example_myapplication_MainActivity_callThirdPartyLib(JNIEnv* env, jobject /* this */) { ThirdPartyLib thirdPartyLib; std::string result = thirdPartyLib.doSomething(); return env->NewStringUTF(result.c_str()); } ``` 其中,`third_party_lib/include/third_party_lib.h`是第三方文件,`ThirdPartyLib`是第三方的类,`doSomething`是第三方函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值