NDK 一步一步了解jni

本文详细介绍了Android NDK的构建系统,包括ndk-build、ndk-gdb的用途,以及Android.mk和Application.mk文件在构建过程中的作用。讲解了如何设置C/C++编译选项,构建静态库、共享库,以及使用预构建库。还提到了APP_OPTIM、LOCAL_ARM_MODE等关键变量,并介绍了强制重构建的命令。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android NDK 的结构: ndk-build :该shell脚本是NDK构建系统的起始点。
ndk-gdb:该shell脚本允许用gnu调试器调试原生组件 Android NDK构建系统是由多种GNU
Makefile片段构成的。这些关键Makefile片段在NDK 安装目录的 build/core子目录中找到
这些脚本可以帮助我们更系统的了解构建过程

APP_CONLYFLAGS 单独设置C代码的编译选项,例如-std=c99 若使用APP_CFLAGS
则会传递给C++代码的编译选项,造成 cc1plus.exe: warning: command line option
‘-std=c99’ is valid for C/ObjC but not for C++ 的警告

Android.mk 是一个向Android NDK构建系统描述NDK项目的GNU Makefile片段。他是每一个NDK项目的必备组件。

Android.mk

# Copyright (C) 2009 The Android Open Source Project   # #号代表此行为注释行
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
LOCAL_PATH := $(call my-dir)  # Android.mk文档必须以LOCAL_PATH变量的定义开头 Android构建系统利用LOCAL_PATH来定位源文件。

include $(CLEAR_VARS) #清除除LOCAL_PATH以外的LOCAL_<name>变量,例如LOCAL_SRC_FILES等

LOCAL_MODULE    := hello-jni  #LOCAL_MODULE变量用来给这个模块设定唯一的名称
LOCAL_SRC_FILES := hello-jni.c #定义用来建立和组装这个模块的源文件列表 可以包含多个源文件名

include $(BUILD_SHARED_LIBRARY) #  构建共享库

1、构建静态库
include $(BUILD_STATIC_LIBRARY)

使用静态库
LOCAL_STATIC_LIBRARIES :=myStaticLib

2、同时使用静态库和共享库

3、用共享库共享通用模块。
若用静态库作为通用模块,则程序中含有多个静态库的副本,导致增加了应用程序大小
4、预构建共享模块
LOCAL_PATH :=$(call my-dir)
#

预构建库

#
include $(CLEAR_VARS)
LOCAL_MODULE := myLib
LOCAL_SRC_FILES := libmyLib.so

include $(PREBUILT_SHARED_LIBRARY)

使用预构建库

LOCAL_SHARED_LIBRARIES := mylib

5、构建独立的可执行文件
include $(BUILD_EXECUTABLE)

6、其他构建系统变量
LOCAL_CPP_FEATURES := rtti #具体C++特性
LOCAL_C_INCLUDES :=$(LOCAL_PATH)/include #用来搜索头文件目录
LOCAL_CFLAGS := -DANDROID #在编译 C和C++源文件时会被传送给编译器
LOCAL_CPP_FLAGS #只在编译C++源文件时被传送给编译器

Application.mk 是NDK构建的一个可选构建文件,它的目的是描述应用程序需要哪些模块;它也定义所有模块的通用变量。
APP_OPTIM:该变量被设置为release和debug 默认release
APP_CFLAGS:在编译任何模块的C和C++源文件时这些标志都会被传递给编译器
APP_CPPFLAGS:在编译任何模块的C++源文件时这些标志都会被传递给编译器
APP_STL :选择不同的STL实现
7、使用NDK-BUILD脚本
ndk-build -B # 强制重构建所有源代码


LOCAL_ARM_MODE: 默认情况下, arm目标二进制会以 thumb 的形式生成(16 位),你可以通过设置这个变量为 arm如果你希望你的 module 是以 32 位指令的形式。
‘arm’ (32-bit instructions) mode. E.g.:
LOCAL_ARM_MODE := arm
注意:可以在编译的时候告诉系统针对某个源码文件进行特定的类型的编译
比如,LOCAL_SRC_FILES := foo.c bar.c.arm 这样就告诉系统总是将 bar.c 以arm的模式编译。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值