文档章节

【Android开发】:在任意目录执行NDK编译

shzwork
 shzwork
发布于 03/26 08:38
字数 1337
阅读 1
收藏 0

文以简单的例子讲述如何在任意目录把自己写的C代码使用NDK提供的交叉编译该工具来编译成Android可使用的静态库/动态库。

1. 准备环境
首先,你得安装了Android的NDK编译工具,假设你的NDK的根目录在 /opt/android/ndk .

当然,最好你能在环境变量里配置一下路径,否则使用ndk-build命令的时候,都得加上路径的前缀了。

修改 ~/.bashrc

export NDK_HOME=/opt/android/ndk
export PATH=$NDK_HOME:$PATH
NDK_HOME=/opt/android/ndk
export PATH=$NDK_HOME:$PATH
1
2
3
4
然后执行:

$ source ~/.bashrc
/.bashrc
1
2
2. 编写 .c 文件
假设你在 ~/math 目录下编写了一个 math.c 文件,内容如下:

#include <stdio.h>

int add( int a , int b ) {
    return a+b;
}


int add( int a , int b ) {
    return a+b;
}
1
2
3
4
5
6
7
8
9
10
OK,后面我们就准备在 ~/math 目录下,将这个.c文件编译为Android可使用的静态库/动态库了。

3. 编译成动态库
编写 Android.mk 文件,内容如下:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := dmath
LOCAL_SRC_FILES := math.c
include $(BUILD_SHARED_LIBRARY)
:= $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := dmath
LOCAL_SRC_FILES := math.c
include $(BUILD_SHARED_LIBRARY)
在 ~/math 目录下,执行 ndk-build 命令,参数如下:

$ ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=./Android.mk
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
根据前一篇文章,我们可以知道,NDK_PROJECT_PATH 指定了需要编译的代码的工程目录,这里给出的是当前目录,APP_BUILD_SCRIPT给出的是Android makefile文件的路径,当然,如果你还有 Application.mk 文件的话,则可以添加 NDK_APPLICATION_MK=./Application.mk

执行完ndk-build命令后,你会发现当前目录下,生成了 obj 和 libs 文件夹,这样,你的libdmath.so动态库就已经制作完成了,在 libs/armeabi 目录下。

4. 编译为静态库
编译为静态库,与编译为动态库唯一的区别就是 Android.mk 文件的写法不同,另外,如果要编译为静态库,则必须有其他的代码引用该静态库代码,ndk-build才会真正执行,否则无法成功生成静态库,这里,我们编写一个 Android.mk ,将 math.c 同时编译成静态库和动态库。

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := smath
LOCAL_SRC_FILES := math.c
include $(BUILD_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := dmath
LOCAL_STATIC_LIBRARIES := smath
LOCAL_SRC_FILES := math.c
include $(BUILD_SHARED_LIBRARY)
:= $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := smath
LOCAL_SRC_FILES := math.c
include $(BUILD_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := dmath
LOCAL_STATIC_LIBRARIES := smath
LOCAL_SRC_FILES := math.c
include $(BUILD_SHARED_LIBRARY)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
同样,在 ~/math 目录下执行:

$ ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=./Android.mk
1
你会在生成的 libs/armeabi 目录下看到动态库libdmath.so,在 obj/local/armeabi 目录下看到静态库 libsmath.a

关于在任意目录将c/c++代码编译为Android可使用的静态库/动态库就介绍到这里了,了解了这个编译过程,对你将来用ndk编译第三方库会很有帮助,另外,如果希望编译为C/C++应用程序在Android机器上运行的话,只需要在代码中加一个main函数,修改Android.mk中的最后一行为 include $(BUILD_EXECUTABLE) 即可。有任何疑问欢迎留言或者来信lujun.hust@gmail.com交流。

5. ndk-build的编译选项
所有给ndk-build的选项都会直接传给GNU Make,由make运行NDK的编译脚本。几个常见调用方式如下:

ndk-build 编译
  ndk-build clean 清掉二进制文件
  ndk-build NDK_DEBUG=1     编译为可调试版的二进制文件
  ndk-build NDK_DEBUG=0     编译为release版
  ndk-build V=1                       执行ndk-build且打印出它所执行的详细编译命令。
  ndk-build -B                          强制重新编译
  ndk-build -B V=1                   -B 和 V=1 的组合
  ndk-build NDK_LOG=1          打印出内部的NDK日志信息(用于调试NDK自己)
  ndk-build NDK_APPLICATION_MK=<文件路径>      用这里指定的路径寻找Application.mk文件
  ndk-build -C <project路径>  先cd进入<project路径>,然后执行ndk-build。
1
2
3
4
5
6
7
8
9
10
6. 编译过程,怎么查看脚本中(makefile)中的变量
$(warning $(XXXX))
1
7. jni中如何指定编译器
在jni/Application.mk中添加

NDK_TOOLCHAIN_VERSION :=4.9
1
NDK_TOOLCHAIN_VERSION. Define this variable as 4.9 to select that version of the GCC compiler. Define this variable as clang to select the Clang compiler,

针对r14b 安卓编译包出现的编译错误:

warning: shared library text segment is not shareable
requires dynamic R_X86_64_PC32 reloc against ‘ff_pw_8’ which may overflow at runtime; recompile with -fPIC

8. ndk工程目录编译后libs与obj目录下库文件的区别
    As part of the build process, the files in the libs folder have been stripped of symbols and debugging information. So you’ll want to keep two copies of each of your .so files: One from the libs folder to install on the Android device, and one from the obj folder to install for GDB to get symbols from.
   libs目录下生成的库是剥离了符号表与调试信息的,而obj下的库是带有调试信息的。
参考网址:https://blog.csdn.net/bidgod/article/details/6930440

9. 待续
参考网址:http://www.tuicool.com/articles/QZJ3qa

参考网址:http://blog.csdn.net/crash163/article/details/52228412
--------------------- 
作者:listener51 
来源:CSDN 
原文:https://blog.csdn.net/listener51/article/details/84026778 
版权声明:本文为博主原创文章,转载请附上博文链接!

本文转载自:https://blog.csdn.net/listener51/article/details/84026778

shzwork
粉丝 11
博文 684
码字总数 10405
作品 0
厦门
私信 提问
Ubuntu下搭建Android NDK开发环境

如何在Ubuntu 系统下搭建Android NDK 开发环境呢?下面一步一步教大家 步骤1.下载NDK(注意我下载的是r4版本): http://dl.google.com/android/ndk/android-ndk-r4b-linux-x86.zip 步骤2.下载...

晨曦之光
2012/03/01
543
0
Ubuntu下搭建Android NDK开发环境

如何在Ubuntu 系统下搭建Android NDK 开发环境呢?下面一步一步教大家 步骤1.下载NDK(注意我下载的是r4版本): http://dl.google.com/android/ndk/android-ndk-r4b-linux-x86.zip 步骤2.下载...

鉴客
2012/03/09
322
0
Ubuntu下搭建Android NDK开发环境

如何在Ubuntu 系统下搭建Android NDK 开发环境呢?下面一步一步教大家 步骤1.下载NDK(注意我下载的是r4版本): http://dl.google.com/android/ndk/android-ndk-r4b-linux-x86.zip 步骤2.下载...

鉴客
2011/12/03
3.7K
0
android-ndk-r7b编译环境Cygwin工具搭建及配置

开发android ndk 的时候需要一个编译工具编译c程序,ndk需要linux下编译,所以win环境下提供Cygwin模拟linux编译C android-ndk 较低版本的这个工具的配置网上很多,我这儿记述点android-ndk...

tonyley
2012/03/14
12.9K
3
使用 Swift 语言编写 Android 应用入门

Swift标准库可以编译安卓armv7的内核,这使得可以在安卓移动设备上执行Swift语句代码。本文解释了如何在你的安卓手机上运行一个简单的“hello,world”程序。 如果你遇到了任何问题,请参考下...

oschina
2016/04/19
12.8K
27

没有更多内容

加载失败,请刷新页面

加载更多

shangcheng-my

1.数据库主键、外键类型为bigint,那么在后台应该用什么类型的变量定义? 后台用string接收,因为前段传过来的一般都是json字符串,后台直接接收,mysql是可以吧数字类型的字符串转换为对应的...

榴莲黑芝麻糊
昨天
2
0
微服务架构依赖图

基于spring-cloud-alibaba + dubbo

龙影
昨天
5
0
Centos7 安装zabbix-agent

rpm -i https://repo.zabbix.com/zabbix/4.2/rhel/6/x86_64/zabbix-release-4.2-2.el6.noarch.rpm 可以到https://repo.zabbix.com/zabbix找到对应的版本 yum install zabbix-agent -y 出现E......

abowu
昨天
8
0
文本编辑器GNU nano 4.4 发布

GNU nano 4.4 "Hagelslag" 更新日志: 启动时,光标可以放在第一个或最后一个出现位置 字符串前面带有+/string 或 +?string的字符串。 发生自动硬包装时((--breaklonglines),任何前导引号...

linuxCool
昨天
7
0
你知道字节序吗

字节序 最近在调一个自定义报文的接口时,本来以为挺简单的,发现踩了好几个坑,其中一个比较“刻骨铭心”的问题就是数据的字节序问题。 背景 自定义报文,调用接口,服务端报文解析失败 iO...

杭城小刘
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部