草庐IT

Android Studio 导入第三方 C/C++库

安然罓安好 2023-03-28 原文

前提说明:

本文以导入 腾讯 IM SDK C++ 为例

库地址:

IM SDK C++下载链接:https://github.com/TencentCloud/TIMSDK/tree/master/Android/IMSDK

image.png

一:C/C++库导入

二:CMakeLists.txt 文件配置

1. 设置目标库

# 添加项目
project("imdemo")

# 添加目标库
add_library(
        imdemo #设置库名称

        SHARED #设置库为共享库

        native-lib.cpp # 添加.cpp源文件
)

注:imdemo 要与 System.loadLibrary("imdemo"); 名称一致

2. 添加库头文件

# 添加依赖头文件路径:直接填 文件夹名称就行
include_directories( include )

3. 添加第三方库

#导入第三方动态库
add_library(imsdk SHARED IMPORTED)

4. 设置第三方库所在位置

#设置第三方库所在位置
set_target_properties(
        imsdk
        PROPERTIES IMPORTED_LOCATION
        # {CMAKE_SOURCE_DIR} 这个地址对应的是 CMakeList.txt 地址,也就是:.../工程名/app/src/main/cpp/,我们需要定位到include文件夹下,所以得改成:${CMAKE_SOURCE_DIR}/../jniLibs
        #/${ANDROID_ABI}表示处理器架构 第三方库必须存放在这类路径下
        # 路径一定要设置正确,不然会报依赖错误(注:一定要仔细、一定要仔细、一定要仔细)
        ${CMAKE_SOURCE_DIR}/../jniLibs/${ANDROID_ABI}/libImSDK.so
)

5. 将第三方库与目标库进行关联

target_link_libraries( # Specifies the target library.
        imdemo

        ${log-lib}

        # 将第三方库与目标库进行关联
        imsdk
)

三:bulid.gradle 配置

android->defaultConfig下 指定 ndk 架构,防止不兼容

defaultConfig {
        ...
        // 指定要ndk需要兼容的架构(这样其他依赖包里mips,x86,"armeabi-v7a",arm-v8之类的so会被过滤掉)
        ndk {
            abiFilters  "armeabi-v7a", "arm64-v8a"  
        }

    }

运行时,如果有遇到库冲突问题,需要在 android->defaultConfig添加如下配置

    defaultConfig {
       ...

        // 指定要ndk需要兼容的架构(这样其他依赖包里mips,x86,"armeabi-v7a",arm-v8之类的so会被过滤掉)
        ndk {
            abiFilters  "armeabi-v7a", "arm64-v8a" 
        }
        //不加这个会导致多个so冲突:https://developer.android.com/r/tools/jniLibs-vs-imported-targets
        sourceSets {
            main {
                // The libs directory contains prebuilt libraries that are used by the
                // app's library defined in CMakeLists.txt via an IMPORTED target.
                jniLibs.srcDirs = ['libs']
            }
        }
    }

--------至此已完成导入,后面可以不用在意。只是将 CMakeLists.txt 配置改成"通配样式"--------

# 设置 cmake 版本
cmake_minimum_required(VERSION 3.18.1)

# 设置项目名称
project("objName")

# 设置.cpp 原文件统一管理变量 src-files
file(GLOB src-files
        ${CMAKE_SOURCE_DIR}/*.cpp # 原文件通配路径
        ${CMAKE_SOURCE_DIR}/folder/*.cpp # 原文件通配路径
        )

#添加目标库
add_library(objName SHARED
        ${src-files})

# 导入头文件
include_directories(include)

# 默认自带
find_library(log-lib log)

# 添加第三方库(xxxx表示第三方库别名)
add_library(xxxx SHARED IMPORTED )

# 设置 so库路径通用变量 jnilibs
set(jnilibs "${CMAKE_SOURCE_DIR}/../jniLibs")

# 设置第三方库对应的所在位置(xxxx表示第三方库别名)
set_target_properties(xxxx PROPERTIES IMPORTED_LOCATION ${jnilibs}/${ANDROID_ABI}/libImSDK.so)

# 设置第三方库统一管理变量 third-party-libs (xxxx表示第三方库别名)
set(third-party-libs
        xxxx
        )

# 将目标库与第三方库关联
target_link_libraries(
        imndkdemo
        ${log-lib}
        ${third-party-libs}
)

有关Android Studio 导入第三方 C/C++库的更多相关文章

  1. ruby - 检查是否通过 require 执行或导入了 Ruby 程序 - 2

    如何检查Ruby文件是否是通过“require”或“load”导入的,而不是简单地从命令行执行的?例如:foo.rb的内容:puts"Hello"bar.rb的内容require'foo'输出:$./foo.rbHello$./bar.rbHello基本上,我想调用bar.rb以不执行puts调用。 最佳答案 将foo.rb改为:if__FILE__==$0puts"Hello"end检查__FILE__-当前ruby​​文件的名称-与$0-正在运行的脚本的名称。 关于ruby-检查是否

  2. ruby - 尝试比较两个文本文件,并根据信息创建第三个 - 2

    我有两个文本文件,master.txt和926.txt。如果926.txt中有一行不在master.txt中,我想写入一个新文件notinbook.txt。我写了我能想到的最好的东西,但考虑到我是一个糟糕的/新手程序员,它失败了。这是我的东西g=File.new("notinbook.txt","w")File.open("926.txt","r")do|f|while(line=f.gets)x=line.chompifFile.open("master.txt","w")do|h|endwhile(line=h.gets)ifline.chomp!=xputslineendende

  3. Ruby:如何从另一个文件导入变量? - 2

    我正在尝试创建一个与compass一起使用的本地配置文件,这样我们就可以处理开发人员机器上的不同导入路径。到目前为止,我已经尝试将文件导入到异常block中,以防它不存在,然后进一步使用该变量:local_config.rbVENV_FOLDER='venv'config.rbVENV_FOLDER='.'beginrequire'local_config.rb'rescueLoadErrorendputsVENV_FOLDER通常我是一名Python开发人员,所以我希望导入将VENV_FOLDER的值更改为venv,但它仍然是。之后。有没有一种方法可以导入local_config.r

  4. ruby - Ruby 导入的方法总是私有(private)的吗? - 2

    最好用一个例子来解释:文件1.rb:deffooputs123end文件2.rb:classArequire'file1'endA.new.foo将给出错误“':调用了私有(private)方法'foo'”。我可以通过执行A.new.send("foo")来解决这个问题,但是有没有办法公开导入的方法?编辑:澄清一下,我没有混淆include和require。另外,我不能使用正常包含的原因(正如许多人正确指出的那样)是因为这是元编程设置的一部分。我需要允许用户在运行时添加功能;例如,他可以说“run-this-app--includefile1.rb”,应用程序的行为将根据他在file1

  5. ruby-on-rails - Rails 导入 CSV 错误 : invalid byte sequence in UTF-8 - 2

    尝试在我的Rails应用程序中导入CSV文件时,出现错误UTF-8中的无效字节序列。一切正常,直到我添加了一个gsub方法来将其中一个CSV列与我的数据库中的一个字段进行比较。当我导入CSV文件时,我想检查每一行的地址是否包含在特定客户端的不同地址数组中。我有一个带有alt_addresses属性的客户端模型,其中包含客户端地址的几种不同可能格式。然后我有一个引用模型(如果您熟悉本地SEO,您就会知道这个术语)。引用模型没有地址字段,但它有一个nap_correct?字段(NAP代表“姓名”、“地址”、“电话号码”)。如果CSV行的名称、地址和电话号码与我在该客户的数据库中拥有的相同,

  6. ruby - git:从 bitbucket 导出并导入 github(带提交) - 2

    我在bitbucket上创建了一个私有(private)git存储库并提交了代码。现在我想导出所有(提交、代码、历史记录)并将其导入github上的gitrepo。有没有办法做到这一点?谢谢 最佳答案 在本地检查所有内容到您的计算机和gitpull。创建一个github存储库将此存储库添加为您的第二个远程(“使用gitremote添加githubURL”)推送到第二个Remote 关于ruby-git:从bitbucket导出并导入github(带提交),我们在StackOverflow

  7. ruby - 使用 rake 导入(调用其他 rakefile) - 2

    这是我的主要rake文件subrake='subrake'task:init=>[subrake]do#callsubrake.buildendimportsubrake我看到有关上述步骤如何工作的文档,但我无法弄清楚如何调用其他subrake文件中的任务。顺便说一句,这些任务可能与我的同名,这是个问题吗? 最佳答案 我想我回答晚了,但几分钟前我也有同样的问题。因此该解决方案可能对某些人有用。Rakefile.rbsubrake='subrake'task:default=>:inittask:init=>["#{subrake}:

  8. ruby - 使用 Sinatra 时如何从 gem 导入 rake 任务? - 2

    我正在尝试向orientdbgem添加一些基本的rake任务,这将允许我创建数据库、创建数据库迁移和迁移数据库——类似于rails迁移。当我在本地执行rake任务时,我可以使用db:settings、db:create和db:create_migration,但是在将它们放入gem之后,我不知道如何从Sinatra访问它们使用“rake”时的应用。我有一种感觉,我要么是a)没有正确地组织gem中的文件和/或b)没有从Sinatra应用程序正确地调用东西。我的fork存储库的当前状态是https://github.com/ricaurte/orientdb-jruby我将任务文件放在li

  9. 【VeighNa】开始量化交易——第三章:构建价差套利 - 2

    文章目录1.价差套利原理1.1概述1.2以BTC为例2.投研分析3.veighna的价差交易回测引擎4.实盘交易1.价差套利原理1.1概述在数字货币交易市场,我们会发现大多数行情下,相同币种之间的不同交割合约会存在一定的价差,由于它们属于同一品种,本身价值不会有任何差别,而且涨跌趋势一致,相关性高。那么如果在它们价差低的时候买入,价差高的时候卖出,这样我们就可以赚取中间的这部分差价。不过在实际交易过程中,我们还需要考虑到交易滑点、手续费、极端行情下,价差走出趋势特征…1.2以BTC为例图一、不同合约的比特币行情图由上图可以看出比特币远月合约与永续合约之间存在一定的价差。图二、某一时刻比特币价差

  10. ruby-on-rails - Ruby DateTime 格式 : How can I get 1st, 第二、第三、第四? - 2

    首先,DateTime格式变量似乎没有在任何地方记录,因此对可以在rubydocs中向我展示此内容的任何人+1。其次,在查看Date.strftime函数代码时,我没有看到任何可以让我执行以下操作的内容:2010年9月9日,星期四有人知道这是否可行吗? 最佳答案 您可能想要takealookhere.总结time=DateTime.nowtime.strftime("%A,%B#{time.day.ordinalize}%Y")请注意,您在纯Ruby(2.0)中运行,您需要调用:require'active_support/core

随机推荐