Android开发实践:在任意目录执行NDK编译
本文暂时不讲述如何用NDK编译第三方开源代码库,而是先以简单的例子讲述如何在任意目录把自己写的C代码编译成Android可使用的静态库/动态库。
1. 准备环境
首先,你得安装了Android的NDK编译工具,假设你的NDK的根目录在 /opt/android/ndk .
当然,最好你能在环境变量里配置一下路径,否则使用ndk-build命令的时候,都得加上路径的前缀了。
修改 ~/.bashrc
1
2
|
export NDK_HOME= /opt/android/ndk
export PATH=$NDK_HOME:$PATH
|
然后执行:
1
|
$ source ~/.bashrc
|
2. 编写 .c 文件
假设你在 ~/math 目录下编写了一个 math.c 文件,内容如下:
1
2
3
4
5
|
#include <stdio.h>
int add( int a , int b ) {
return a+b;
}
|
OK,后面我们就准备在 ~/math 目录下,将这个.c文件编译为Android可使用的静态库/动态库了。
3. 编译成动态库
编写 Android.mk 文件,内容如下:
1
2
3
4
5
6
|
LOCAL_PATH := $(call my- dir )
include $(CLEAR_VARS)
LOCAL_MODULE := dmath
LOCAL_SRC_FILES := math.c
include $(BUILD_SHARED_LIBRARY)
|
在 ~/math 目录下,执行 ndk-build 命令,参数如下:
1
|
$ ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=. /Android .mk
|
根据前一篇文章,我们可以知道,NDK_PROJECT_PATH 指定了需要编译的代码的工程目录,这里给出的是当前目录,APP_BUILD_SCRIPT给出的是Android makefile文件的路径,当然,如果你还有 Application.mk 文件的话,则可以添加 NDK_APP_APPLICATION_MK=./Application.mk
执行完ndk-build命令后,你会发现当前目录下,生成了 obj 和 libs 文件夹,这样,你的libdmath.so动态库就已经制作完成了,在 libs/armeabi 目录下。
4. 编译为静态库
编译为静态库,与编译为动态库唯一的区别就是 Android.mk 文件的写法不同,另外,如果要编译为静态库,则必须有其他的代码引用该静态库代码,ndk-build才会真正执行,否则无法成功生成静态库,这里,我们编写一个 Android.mk ,将 math.c 同时编译成静态库和动态库。
1
2
3
4
5
6
7
8
9
10
11
12
|
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)
|
同样,在 ~/math 目录下执行:
1
|
$ ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=. /Android .mk
|
你会在生成的 libs/armeabi 目录下看到动态库libdmath.so,在 obj/local/armeabi 目录下看到静态库 libsmath.a
关于在任意目录将c/c++代码编译为Android可使用的静态库/动态库就介绍到这里了,了解了这个编译过程,对你将来用ndk编译第三方库会很有帮助,另外,如果希望编译为C/C++应用程序在Android机器上运行的话,只需要在代码中加一个main函数,修改Android.mk中的最后一行为 include $(BUILD_EXECUTABLE) 即可。
本文转自 Jhuster 51CTO博客,原文链接:http://blog.51cto.com/ticktick/1428354,如需转载请自行联系原作者
Android开发实践:在任意目录执行NDK编译相关推荐
- 【Android开发】:在任意目录执行NDK编译
2019独角兽企业重金招聘Python工程师标准>>> 文以简单的例子讲述如何在任意目录把自己写的C代码使用NDK提供的交叉编译该工具来编译成Android可使用的静态库/动态库. ...
- Xamarin.Android开发实践(十七)
Xamarin.Android开发实践(十七) 原文:Xamarin.Android开发实践(十七) Xamarin.Android之定位 一.前言 打开我们手中的应用,可以发现越来越多的应用使用了定 ...
- Android开发实践:Java层与Jni层的数组传递
Android开发中,经常会在Java代码与Jni层之间传递数组(byte[]),一个典型的应用是Java层把需要发送给客户端的数据流传递到Jni层,由Jni层的Socket代码发送出去,当然,Jni ...
- android并发命令,Android开发实践:基于命令模式的异步任务线程
关于Android的异步操作,我在文章<Android开发实践:线程与异步任务>中介绍了两种方法,一种是采用线程,另一种是采用AsyncTask,今天再深入探讨下另一种模型:命令式的异步任 ...
- Xamarin.Android开发实践(十四)
原文:Xamarin.Android开发实践(十四) Xamarin.Android之ListView和Adapter 一.前言 如今不管任何应用都能够看到列表的存在,而本章我们将学习如何使用Xama ...
- Android开发 ---如何操作资源目录中的资源文件2
Android开发 ---如何操作资源目录中的资源文件2 一.颜色资源管理 效果图: 描述: 1.改变字体的背景颜色 2.改变字体颜色 3.改变按钮颜色 4.图像颜色切换 操作描述: 点击(1)中的颜 ...
- Xamarin.Android开发实践(一)
原文:Xamarin.Android开发实践(一) 一.准备工作 1.创建一个空的解决方案,并命名为Phoneword 2.右击解决方案 新建->新建项目 并命名为Phoneword_Droid ...
- Android开发笔记(七十)反编译初步
查看平台源码 查看内核源码 Android的内核源码很大,有几个G,仔细找找网上有许多下载的地方.作为普通开发者,一般不需要阅读内核源码,但一点都不了解好像也不行,因为实际开发中有时候就得会那么一点点 ...
- Android开发实践:常用NDK命令行参数
Android提供了NDK工具,用来编译native代码(c/c++),该工具配置好了相关的交叉编译环境和工具链,只需要你简单地编写几个.mk文件即可将你的c/c++代码编译为Android的java ...
最新文章
- 多看看把,条件太多了--leetcode 93. 复原 IP 地址
- /sbin/ifup: configuration for eth0 not found解决
- #135. 二维树状数组 3:区间修改,区间查询
- CLR Via C# 3rd 阅读摘要 -- Chapter 28 – Primitive Thread Synchronization Constructs
- 一篇文章入门深度学习框架PyTorch
- 四川高职计算机二本线学校,全网首发!四川省本科二批次2019年对口高职投档录取线出炉...
- python wxpython_python GUI wxPython
- Tomcat 通用组件
- Exps on March 21st
- HDU 5980 位运算 进制转换函数 DEV C++调试失败的原因
- 情人节,给你们发点福利。
- Verilog写一个对数计算模块Log2(x)
- python制作中文词云图_Python3制作中文词云图
- DayDayUp:2020,再见了,不平凡的一年,让我懂得了珍惜,让我明白了越努力越幸运
- 舒缓肩颈酸痛,温暖呵护颈椎,宾多康智能颈椎按摩仪体验
- cmd查看python库命令_怎么用命令查看python的库
- JAVA兴趣小组申请理由_关于参与兴趣小组申请书范文
- 二维码学习笔记(二) | 数据分析与数据编码
- 义乌集训Day 6 T2
- [openwrt]coredump设置