Arman_ 2024-01-05 17:49 采纳率: 28.6%
浏览 13
已结题

使用GN (Generate Ninja) 编译Android平台动态库

GNTest/
|-- module/
  |-- api
    |-- TestClient.hpp
    |-- TestClientImpl.cpp
    |-- BUILD.gn
  |-- api2
    |-- test.hpp
    |-- test.cpp 
  |-- BUILD.gn
|-- build/
  |-- BUILDCONFIG.gn
|-- BUILD.gn
|-- .gn

上面这个是工程目录结构。请帮助我使用GN (Generate Ninja) 和Android NDK(android最低版本21)将上面module目录下的c++(c++11即可)文件编译为 Android 平台能使用的动态库(只需要arm64即可)。
请保证能在macOS或ubuntu18 上编译通过,不要使用GPT等其他AI工具生成的来浪费大家时间,因为我都试过了。__
感谢你

  • 写回答

14条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-01-05 17:49
    关注

    引自免费微信小程序:皆我百晓生

    为了将module目录下的C++文件编译为Android平台能使用的动态库,你可以按照以下步骤操作:

    1. 确保你已经安装了GN和Android NDK,并添加了相应的环境变量。

    2. 在module目录下创建一个名为BUILD.gn的文件,文件内容如下:

    group("module") {
      toolchain("target") {
        tool("gcc") {
          cflags = [
            "-fPIC",
            "-std=c++11",
          ]
          libs = [
            "-latomic",
          ]
        }
      }
    
      source_set("module_sources") {
        sources = [
          "TestClientImpl.cpp",
          "test.cpp",
        ]
        deps = [
          "//module/api:api",
          "//module/api2:api2",
        ]
        visibility = [ "//build:public" ]
        target_os = "android"
        target_cpu = "arm64"
      }
    
      cc_shared_library("module_shared") {
        deps = [ ":module_sources" ]
        visibility = [ "//build:public" ]
        target_os = "android"
        target_cpu = "arm64"
      }
    }
    

    这个BUILD.gn文件定义了一个C++的source_set模块和一个cc_shared_library模块来编译动态库。注意,这里使用了"-std=c++11"将C++标准设置为C++11,使用了"-fPIC"来生成位置无关代码。

    1. 在api目录下创建一个名为BUILD.gn的文件,文件内容如下:
    group("api") {
      toolchain("target") {
        tool("gcc") {
          cflags = [
            "-fPIC",
            "-std=c++11",
          ]
        }
      }
    
      source_set("api_sources") {
        sources = [
          "TestClient.hpp",
        ]
        visibility = [ "//build:public" ]
        target_os = "android"
        target_cpu = "arm64"
      }
    
      cc_library("api") {
        deps = [ ":api_sources" ]
        visibility = [ "//build:public" ]
        target_os = "android"
        target_cpu = "arm64"
      }
    }
    

    这个BUILD.gn文件定义了一个C++的source_set模块和一个cc_library模块来编译api库。

    1. 在api2目录下创建一个名为BUILD.gn的文件,文件内容如下:
    group("api2") {
      toolchain("target") {
        tool("gcc") {
          cflags = [
            "-fPIC",
            "-std=c++11",
          ]
        }
      }
    
      source_set("api2_sources") {
        sources = [
          "test.cpp",
        ]
        visibility = [ "//build:public" ]
        target_os = "android"
        target_cpu = "arm64"
      }
    
      cc_library("api2") {
        deps = [ ":api2_sources" ]
        visibility = [ "//build:public" ]
        target_os = "android"
        target_cpu = "arm64"
      }
    }
    

    这个BUILD.gn文件定义了一个C++的source_set模块和一个cc_library模块来编译api2库。

    1. 在GNTest目录下创建一个名为BUILD.gn的文件,文件内容如下:
    import("//build/BUILDCONFIG.gn")
    
    group("root") {
      toolchain("target") {
        tool("gcc") {
          cflags = [
            "-fPIC",
            "-std=c++11",
          ]
          libs = [
            "-latomic",
          ]
        }
      }
    
      source_set("main_sources") {
        sources = []
        deps = [
          "//module:module_shared",
        ]
        visibility = [ "//build:public" ]
        target_os = "android"
        target_cpu = "arm64"
      }
    
      action("gn_all") {
        script = "//build/config/ninja:run_script"
        args = [
          "build",
          "--root=.",
          "--args=target_cpu=\"arm64\"",
        ]
        sources = [
          "//module:module_shared",
        ]
        outputs = [ "build.ninja" ]
        deps = [
          ":main_sources",
        ]
        exec_script = "//build/toolchain/ninja:executable"
      }
    }
    

    这个BUILD.gn文件定义了一个C++的source_set模块和一个action模块来生成Ninja构建文件。

    1. 在GNTest目录下创建一个名为.gn的文件,文件内容如下:
    buildconfig = "//build/BUILDCONFIG.gn"
    

    这个.gn文件用于指定buildconfig文件的位置。

    1. 在build目录下创建一个名为BUILDCONFIG.gn的文件,文件内容如下:
    buildtarget = target_os + "_" + target_cpu
    my_default_toolchain = "target"
    

    这个BUILDCONFIG.gn文件用于指定默认的构建目标和默认的工具链。

    1. 最后,在终端中进入GNTest目录,并运行以下命令生成Ninja构建文件:
    gn gen out/Default
    

    这会在out/Default目录下生成构建文件。

    1. 运行以下命令来编译动态库:
    ninja -C out/Default
    

    这会在out/Default目录下生成编译好的动态库文件。

    希望这个解决方案对你有帮助!如果你对某个步骤有疑问或遇到问题,请详细描述,并提供相关错误信息。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 1月9日
  • 请详细说明问题背景 1月9日
  • 创建了问题 1月5日

悬赏问题

  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line