ndk-build

目录

    • 一、运行ndk
    • 二、Application.mk
    • 三、Android.mk
      • 3.0、模块名定义
      • 3.1、源码
      • 3.2、头文件搜索
      • 3.3、头文件导出
      • 3.4、编译、链接flags配置
      • 3.5、产物类型
    • 四、模块依赖处理
      • 1、源码模块依赖
      • 2、预编译库依赖

一、运行ndk

  • NDK_APPLICATION_MK:指定Application.mk文件所在位置,每个ndk工程都需要有一个Application.mk文件来配置全局的编译信息。
  • -C:编译开始的目录。
ndk-build NDK_DEBUG=1 NDK_PROJECT_PATH=null NDK_APPLICATION_MK=src/main/jni/Application.mk NDK_OUT=build/out NDK_LIBS_OUT=build/react-ndk/all THIRD_PARTY_NDK_DIR=build/third-party-ndk REACT_COMMON_DIR=../ReactCommon REACT_SRC_DIR=$projectDir/src/main/java/com/facebook/react -C src/main/jni/react/jni

二、Application.mk

  • APP_BUILD_SCRIPT:指定编译脚本
  • APP_ABI:指定编译的CPU架构
  • APP_PLATFORM:指定编译目标Android版本号
  • NDK_MODULE_PATH:ndk编译时搜索模块时要查找的目录
  • APP_STL:编译使用的C++标准库
  • APP_CFLAGS:全局的C编译flags
  • APP_CPPFLAGS:全局的C++编译flags
  • APP_LDFLAGS:全局的链接flags
# Copyright (c) Facebook, Inc. and its affiliates.
#
# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.APP_BUILD_SCRIPT := Android.mkAPP_ABI := armeabi-v7a x86 arm64-v8a x86_64
APP_PLATFORM := android-16APP_MK_DIR := $(dir $(lastword $(MAKEFILE_LIST)))# What is NDK_MODULE_PATH?
#   This is comparable to the PATH environment variable in Linux. The purpose
#   of NDK_MODULE_PATH is to provide a list of directories that contain modules
#   we want ndk-build to compile.
#
# What is HOST_DIRSEP?
#   In PATH, the directories are separated by a ':'.
#   In NDK_MODULE_PATH, the directories are separated by $(HOST_DIRSEP).
#
# Where are APP_MK_DIR, THIRD_PARTY_NDK_DIR, etc. defined?
#   The directories inside NDK_MODULE_PATH (ex: APP_MK_DIR, THIRD_PARTY_NDK_DIR,
#   etc.) are defined inside build.gradle.
NDK_MODULE_PATH := $(APP_MK_DIR)$(HOST_DIRSEP)$(THIRD_PARTY_NDK_DIR)$(HOST_DIRSEP)$(REACT_COMMON_DIR)$(HOST_DIRSEP)$(APP_MK_DIR)first-party$(HOST_DIRSEP)$(REACT_SRC_DIR)APP_STL := c++_sharedAPP_CFLAGS := -Wall -Werror -fexceptions -frtti -DWITH_INSPECTOR=1
APP_CPPFLAGS := -std=c++1y
# Make sure every shared lib includes a .note.gnu.build-id header
APP_LDFLAGS := -Wl,--build-idNDK_TOOLCHAIN_VERSION := clang

三、Android.mk

3.0、模块名定义

LOCAL_MODULE

3.1、源码

要参与编译的c、cpp文件,以及so、.a文件都可以做为src文件。
LOCAL_SRC_FILES

3.2、头文件搜索

编译源码时什么哪里搜索文件
LOCAL_C_INCLUDES

3.3、头文件导出

导出头文件给其他模块使用
LOCAL_EXPORT_C_INCLUDES

3.4、编译、链接flags配置

LOCAL_CFLAGSLOCAL_CPPFLAGSLOCL_LDFLAGS

3.5、产物类型

  • 可执行文件
    include $(BUILD_EXECUTABLE)
  • 动态库
    include $(BUILD_SHARED_LIBRARY)
  • 静态库
    include $(BUILD_STATIC_LIBRARY)
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)# Include . in the header search path for all source files in this module.
LOCAL_C_INCLUDES := $(LOCAL_PATH)# Include ./../../ in the header search path for modules that depend on
# reactnativejni. This will allow external modules to require this module's
# headers using #include <react/jni/<header>.h>, assuming:
#   .     == jni
#   ./../ == react
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../..LOCAL_CFLAGS += -fexceptions -frtti -Wno-unused-lambda-captureLOCAL_LDLIBS += -landroid# The dynamic libraries (.so files) that this module depends on.
LOCAL_SHARED_LIBRARIES := libfolly_json libfb libfbjni libglog_init libyoga# The static libraries (.a files) that this module depends on.
LOCAL_STATIC_LIBRARIES := libreactnative libcallinvokerholder# Name of this module.
#
# Other modules can depend on this one by adding libreactnativejni to their
# LOCAL_SHARED_LIBRARIES variable.
LOCAL_MODULE := reactnativejni# Compile all local c++ files.
LOCAL_SRC_FILES := $(wildcard *.cpp)ifeq ($(APP_OPTIM),debug)# Keep symbols by overriding the strip command invoked by ndk-build.# Note that this will apply to all shared libraries,# i.e. shared libraries will NOT be stripped# even though we override it in this Android.mkcmd-strip :=
endif# Build the files in this directory as a shared library
include $(BUILD_SHARED_LIBRARY)# Compile the c++ dependencies required for ReactAndroid
#
# How does the import-module function work?
#   For each $(call import-module,<module-dir>), you search the directories in
#   NDK_MODULE_PATH. (This variable is defined in Application.mk). If you find a
#   <module-dir>/Android.mk you in a directory <dir>, you run:
#   include <dir>/<module-dir>/Android.mk
#
# What does it mean to include an Android.mk file?
#   Whenever you encounter an include <dir>/<module-dir>/Android.mk, you
#   tell andorid-ndk to compile the module in <dir>/<module-dir> according
#   to the specification inside <dir>/<module-dir>/Android.mk.
$(call import-module,folly)
$(call import-module,fb)
$(call import-module,fbjni)
$(call import-module,jsc)
$(call import-module,fbgloginit)
$(call import-module,yogajni)
$(call import-module,cxxreact)
$(call import-module,jsi)
$(call import-module,jsiexecutor)
$(call import-module,callinvoker)
$(call import-module,hermes)include $(REACT_SRC_DIR)/turbomodule/core/jni/Android.mk# TODO(ramanpreet):
#   Why doesn't this import-module call generate a jscexecutor.so file?
# $(call import-module,jscexecutor)include $(REACT_SRC_DIR)/jscexecutor/Android.mk
include $(REACT_SRC_DIR)/../hermes/reactexecutor/Android.mk
include $(REACT_SRC_DIR)/../hermes/instrumentation/Android.mk
include $(REACT_SRC_DIR)/modules/blob/jni/Android.mk

四、模块依赖处理

1、源码模块依赖

使用LOCAL_SHARED_LIBRARIESLOCAL_STATIC_LIBRARIES进行依赖,但需要使用以下同种方式中的一种,将依赖的模块添加到当前模块。

  • 使用include xxx/Android.mk方式,直接依赖具体的某个mk文件,如include $(REACT_SRC_DIR)/turbomodule/core/jni/Android.mk
  • 使用import-module方式,通过Application.mk文件中,NDK_MODULE_PATH变量配置的路径进行搜索。如$(call import-module, yoga)

2、预编译库依赖

如果预编译库是系统库,可以直接使用LOCAL_LDLIBS引入。对于非系统库,需要做特殊处理:在ndk编译系统里,非系统预编译库需要使用模块(module)方式封闭起来,再按源码模块依赖方式添加到目标模块为其使用。这样做可以将预编译库,及其相关头文件形成一个整体,简化其他模块的引用。预编译库没有源码,只有编译好的.so或.a文件,封装模块时的LOCL_SRC_FILES直接使用编译好的库文件即可。

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE:= jsc
LOCAL_SRC_FILES := jni/$(TARGET_ARCH_ABI)/libjsc.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)
include $(PREBUILT_SHARED_LIBRARY)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/853641.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux之重定向输出符号

Linux之重定向输出符号>与>> 使用重定向运算符">“和”>>"将终端输出保存到文件中 【1】> :他将输出重定向到文件并覆盖文件的现有内容 命令格式 $ command > [filename]例子 $ honstnamectl > myfile.txt --将honstnamectl(查…

程序员的核心职业素养:专业、沟通与持续学习

✨作者主页&#xff1a; Mr.Zwq✔️个人简介&#xff1a;一个正在努力学技术的Python领域创作者&#xff0c;擅长爬虫&#xff0c;逆向&#xff0c;全栈方向&#xff0c;专注基础和实战分享&#xff0c;欢迎咨询&#xff01; 您的点赞、关注、收藏、评论&#xff0c;是对我最大…

AI大模型会让搜索引擎成为历史吗?

AI大模型会让搜索引擎成为历史吗&#xff1f; 随着人工智能技术的不断发展&#xff0c;AI大模型已经在许多领域展现出了强大的能力。从自然语言处理到图像识别&#xff0c;AI大模型的应用越来越广泛。在这种背景下&#xff0c;有人开始提出一个问题&#xff1a;AI大模型是否可…

我真希望学计算机前,就知道这些该多好

计算机基础贯穿着我们整个计算机生涯&#xff0c;而对大学生来说&#xff0c;基础一方面是内功&#xff0c;一方面也是面试考察的重点。直观的来说&#xff0c;校招&#xff1a;计算机基础&#xff08;90%&#xff09;专业知识&#xff08;10%&#xff09;&#xff0c;社招&…

TVBOX 最新版下载+视频源教程

下载链接 wx 搜索 Geek 前端 发送电视资源进行获取 操作教程

51单片机STC89C52RC——2.2 独立按键控制LED亮灭Plus

目的 当独立K1按键按一下&#xff08;立即松开&#xff09;&#xff0c;LED D1点亮。再按一下K1&#xff08;立即松开&#xff09;LED D1熄灭。 与前一节《51单片机STC89C52RC——2.1 独立按键控制LED亮灭》当独立K1按键按下时LED D1 点亮&#xff0c;松开D1熄灭 效果不一…

文章MSM_metagenomics(五):共现分析

欢迎大家关注全网生信学习者系列&#xff1a; WX公zhong号&#xff1a;生信学习者Xiao hong书&#xff1a;生信学习者知hu&#xff1a;生信学习者CDSN&#xff1a;生信学习者2 介绍 本教程是使用一个Python脚本来分析多种微生物&#xff08;即strains, species, genus等&…

持续集成jenkins+gitee

首先要完成gitee部署&#xff0c;详见自动化测试git的使用-CSDN博客 接下来讲如何从git上自动拉取代码&#xff0c;实现jenkins无人值守&#xff0c;定时执行测试&#xff0c;生成测试报告。 需要这三个安装包 由于目前的jenkins需要至少java11到java17的版本&#xff0c;所以…

高考毕业季--浅谈自己感想

随着2024年高考落幕&#xff0c;数百万高三学生又将面临人生中的重要抉择&#xff1a;选择大学专业。在这个关键节点&#xff0c;计算机相关专业是否仍是“万金油”的选择&#xff1f;在过去很长一段时间里&#xff0c;计算机科学与技术、人工智能、网络安全、软件工程等专业一…

JVM 性能分析案列——使用 JProfiler 工具分析 dump.hprof 堆内存快照文件排查内存溢出问题

在 windows 环境下实现。 参考文档 一、配置 JVM 参数 配置两个 JVM 参数&#xff1a; -XX:HeapDumpOnOutOfMemoryError&#xff0c;配置这个参数&#xff0c;会在发生内存溢出时 dump 生成内存快照文件&#xff08;xxx.hprof&#xff09;-XX:HeapDumpPathF:\logs&#xff…

1667. 修复表中的名字

1667. 修复表中的名字 题目链接&#xff1a;1667. 修复表中的名字 代码如下&#xff1a; # Write your MySQL query statement below select user_id,concat(upper(substring(name,1,1)),lower(substring(name,2))) as name from Users order by user_id

VSCode使用git出现的问题记录--git回退

1.远程仓库回退 有时候&#xff0c;已经将错误的代码推送到了远程仓库&#xff0c;需要回退到之前的正确版本。 &#xff08;1&#xff09;查看提交历史记录&#xff0c;找到要回退的提交ID git log回退到指定版本 git reset --hard commit_id本地代码就回退到了正确版本。但…

力控算法每日一练:209. 长度最小的子数组(java)

给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl1, ..., numsr-1, numsr] &#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0 。 class Solution {public int minSu…

代码随想录算法训练营第三十八天| 509. 斐波那契数 ,70. 爬楼梯,746. 使用最小花费爬楼梯

509. 斐波那契数 - 力扣&#xff08;LeetCode&#xff09; class Solution {public int fib(int n) {if (n < 1) {return n;}int[] dp new int[n 1];dp[0] 0;dp[1] 1;for (int i 2; i < n; i) {dp[i] dp[i - 1] dp[i - 2];}return dp[n];} } 70. 爬楼梯 - 力扣&am…

十二星座女、具有哪些情感特质。

白羊座&#xff08;奋不顾身&#xff09;。金牛座&#xff08;爱财如命&#xff09;。双子座&#xff08;灵活多变&#xff09;。 巨蟹座&#xff08;似水柔情&#xff09;。狮子座&#xff08;光明磊落&#xff09;。处女座&#xff08;尽善尽美&#xff09;。 天秤座&#xf…

怎样在C语⾔中制作动画?

一、问题 利⽤ C语⾔中的图形函数可以实现动画吗&#xff1f;怎样实现&#xff1f; 二、解答 动画其实就是快速切换的页⾯。如果动画中变化的元素⽐较集中&#xff0c;可以使⽤绘画、延时的⽅法来制作。例如&#xff0c;在下⾯的程序中&#xff0c;先绘制⼀个逆时针⽅向逐渐打…

安装wsl

安装wsl 先决条件&#xff1a; 打开控制面板->选择程序与功能->选择启动或关闭windows功能&#xff0c;将以下框选的勾选上 二、到Mircosoft store下载Ubuntu 三、如果以上都勾选了还报以下错误 注册表错误 0x8007019e Error code: Wsl/CallMsi/REGDB_E_CLASSNOTREG…

【three.js】旋转、缩放、平移几何体

目录 一、缩放 二、平移 三、旋转 四、居中 附源码 BufferGeometry通过.scale()、.translate()、.rotateX()、.rotateY()等方法可以对几何体本身进行缩放、平移、旋转,这些方法本质上都是改变几何体的顶点数据。 我们先创建一个平面物体,样子是这样的。 一、缩放 // 几何…

重新安装 Windows 10 后如何恢复丢失的数据?

“嗨&#xff0c;我的 Windows 10 崩溃了&#xff0c;所以我不得不重新安装它。我使用 USB 可启动驱动器重新安装了操作系统。但是&#xff0c;重新安装后&#xff0c;C 盘上的所有先前文件都丢失了。有什么方法可以恢复丢失的文件吗&#xff1f;” - Jacky 在大多数情况下&am…

可视化程序设计OJ技术研究

可视化程序设计OJ技术研究 “Exploring OJ Technology in Visual Program Design” 完整下载链接:可视化程序设计OJ技术研究 文章目录 可视化程序设计OJ技术研究摘要第一章 可视化程序设计概述1.1 可视化程序设计的定义1.2 可视化程序设计的应用领域1.3 可视化程序设计的发展…