本文暂时不讲述如何用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编译相关推荐

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

    2019独角兽企业重金招聘Python工程师标准>>> 文以简单的例子讲述如何在任意目录把自己写的C代码使用NDK提供的交叉编译该工具来编译成Android可使用的静态库/动态库. ...

  2. Xamarin.Android开发实践(十七)

    Xamarin.Android开发实践(十七) 原文:Xamarin.Android开发实践(十七) Xamarin.Android之定位 一.前言 打开我们手中的应用,可以发现越来越多的应用使用了定 ...

  3. Android开发实践:Java层与Jni层的数组传递

    Android开发中,经常会在Java代码与Jni层之间传递数组(byte[]),一个典型的应用是Java层把需要发送给客户端的数据流传递到Jni层,由Jni层的Socket代码发送出去,当然,Jni ...

  4. android并发命令,Android开发实践:基于命令模式的异步任务线程

    关于Android的异步操作,我在文章<Android开发实践:线程与异步任务>中介绍了两种方法,一种是采用线程,另一种是采用AsyncTask,今天再深入探讨下另一种模型:命令式的异步任 ...

  5. Xamarin.Android开发实践(十四)

    原文:Xamarin.Android开发实践(十四) Xamarin.Android之ListView和Adapter 一.前言 如今不管任何应用都能够看到列表的存在,而本章我们将学习如何使用Xama ...

  6. Android开发 ---如何操作资源目录中的资源文件2

    Android开发 ---如何操作资源目录中的资源文件2 一.颜色资源管理 效果图: 描述: 1.改变字体的背景颜色 2.改变字体颜色 3.改变按钮颜色 4.图像颜色切换 操作描述: 点击(1)中的颜 ...

  7. Xamarin.Android开发实践(一)

    原文:Xamarin.Android开发实践(一) 一.准备工作 1.创建一个空的解决方案,并命名为Phoneword 2.右击解决方案 新建->新建项目 并命名为Phoneword_Droid ...

  8. Android开发笔记(七十)反编译初步

    查看平台源码 查看内核源码 Android的内核源码很大,有几个G,仔细找找网上有许多下载的地方.作为普通开发者,一般不需要阅读内核源码,但一点都不了解好像也不行,因为实际开发中有时候就得会那么一点点 ...

  9. Android开发实践:常用NDK命令行参数

    Android提供了NDK工具,用来编译native代码(c/c++),该工具配置好了相关的交叉编译环境和工具链,只需要你简单地编写几个.mk文件即可将你的c/c++代码编译为Android的java ...

最新文章

  1. 多看看把,条件太多了--leetcode 93. 复原 IP 地址
  2. /sbin/ifup: configuration for eth0 not found解决
  3. #135. 二维树状数组 3:区间修改,区间查询
  4. CLR Via C# 3rd 阅读摘要 -- Chapter 28 – Primitive Thread Synchronization Constructs
  5. 一篇文章入门深度学习框架PyTorch
  6. 四川高职计算机二本线学校,全网首发!四川省本科二批次2019年对口高职投档录取线出炉...
  7. python wxpython_python GUI wxPython
  8. Tomcat 通用组件
  9. Exps on March 21st
  10. HDU 5980 位运算 进制转换函数 DEV C++调试失败的原因
  11. 情人节,给你们发点福利。
  12. Verilog写一个对数计算模块Log2(x)
  13. python制作中文词云图_Python3制作中文词云图
  14. DayDayUp:2020,再见了,不平凡的一年,让我懂得了珍惜,让我明白了越努力越幸运
  15. 舒缓肩颈酸痛,温暖呵护颈椎,宾多康智能颈椎按摩仪体验
  16. cmd查看python库命令_怎么用命令查看python的库
  17. JAVA兴趣小组申请理由_关于参与兴趣小组申请书范文
  18. 二维码学习笔记(二) | 数据分析与数据编码
  19. 义乌集训Day 6 T2
  20. [openwrt]coredump设置

热门文章

  1. 一文看懂集成学习(详解 bagging、boosting 以及他们的4点区别)
  2. AI检测制造“零缺陷”
  3. 任正非:华为自己做芯片很难,咬着牙慢慢挺过来了
  4. AI综述专栏 | 基于深度学习的目标检测算法综述
  5. 关于卷积的6个基本知识
  6. 人工智能再升温:零售行业如何抢占AI先机
  7. 使用Java程序消费SAP Leonardo的机器学习API
  8. 美国AI就业市场全景:开放职位512个,基本工资最高26万美元
  9. 干货丨盘点人工智能从业者必备的10个深度学习方法
  10. 《数学之美》第16章 信息指纹及其应用