工作需要编译android下的动态库,本以为是一件简单的事,没想到因为工具,以及google本身被墙的原因,折腾了好久。

在windows外的平台搞事情,寿命都得缩短。

一种方案是用eclipse+ndk+adt插件,总之是eclipse下适配android ndk的一套东西,我搜了一些文档,看到一大堆冗余的名字,文件,感觉不对味,放弃。

另一种方案是android studio,初看觉得是大公司出品,且针对的是自家系统的IDE,能保持个一贯性,没想到各个版本差别挺大,一时换一套编译底层,一时换一套构建系统,菜单变换也大,姑且算你迭代很快,不过都出来这么多年了,为啥就不能像visual studio看齐?搞得我在网上搜各种文档还得仔细区分版本,特别是你不熟悉时,简直是斗智斗勇。

1 下载android-ndk,安装。

2 下载android studio 2.3,安装过程会提示你选择ndk目录以及sdk目录,自带了android sdk,建议就用它自带的sdk,不然十有八九又搞出事情。

3 安装好后启动,界面上第一行是创建新工程,创建后会卡上10几分钟进不去,因为android studio需要下载gradle,而国内是下载不了的,于是她妹的卡了,连个提示都没有,vpn重连也没用。所以得去gradle官    网下,这里你还得选择gradle版本,如何查看版本,又是一件蛋疼的事。我是去到C:\Users\用户名\.gradle\wrapper\dists下看到gradle-3.3-all文件夹,选择了下载3.3-all版本,然后把下载到的压缩文件放到              C:\Users\用户名\.gradle\wrapper\dists\gradle-3.3-all\55gk2rcmfc6p2dg9u9ohc3hw9下,才终于顺利通过这一步。

4 创建工程界面,选择c++ support。

5 进去之后,你还有2个东西要下。去到菜单栏tools/android/sdkmanager打开,默认会选中左边导航栏的android sdk选项,右边界面有3个标签sdk platform,sdk tools,sdk update sites,选择中间的sdk tools,    下载cmake,lldb。稍后将用cmake构建c/c++文件。2.3之前的版本还需要配置gradle关联到CMakeLists.txt文件,现在不需要了,所以你如果网上搜到一大堆配置文档就跳过吧。

6 下载后,经常会便秘,你很可能需要重启android studio, 不然新下的库找不到,同步是没有用的。

7  接下来需要配置路径了。首先左边是project视图,在文件树下找到local.properties,追加ndk的路径,虽然你已经在创建工程时选过,但这里还是得填:

ndk.dir=D\:\\sdk\\Android\\android-ndk-r14b

8  接下来添加c/c++源码文件,你在左边的project视图下,找到app/src/main/cpp文件夹,你的源码需要放到这个目录下,去硬盘上找到对应的目录把代码拷进去。

然后在视图右键点击app目录,应该有个synchronize ‘app’选项,点击同步,在cpp下应该可以刷出来你新加的源码了。这里如果是新建工程,记得把native-lib.cpp示例文件删除,不要直接在硬盘删除,通过     ide里右键点击delete,不然很可能又抽一次疯。

你以为完了?远着呢。在src目录下,找到CMakeLists.txt文件,手动添加你的.c或.cpp文件,没错,就是这么任性,你有多少个c文件,就要加多少行如下:

add_library( # Sets the name of the library.
native-lib # Sets the library as a shared library.
SHARED # Provides a relative path to your source file(s).
src/main/cpp/lapi.c
src/main/cpp/lauxlib.c
src/main/cpp/lbaselib.c
)

如以上在add_library下添加源码。然后你还得添加头文件目录如下:

# Specifies a path to native header files.
include_directories(src/main/cpp/)

与add_library并列,这里根据你的源码文件目录一个一个添加吧。我在右键选项里发现有new,创建新文件,有import,导入eclipse工程,就是没有add exisiting files选项加入已存在源码...

9  接下来你可能需要更改动态库名,还是在CMakeLists.txt文件里搜索native-lib,都替换为你需要的名字,具体含义自己去搞清楚吧,不赘述了。

10  最右边的垂直标签条,点击build variants,把debug更换为release,编译release版本。

11 点击菜单栏build/make moudle...,应该能生成.so文件了。位置在..\app\build\intermediates\cmake\release\obj下。

android studio 2.3 编译动态库的更多相关文章

  1. android studio 使用 jni 编译 opencv 完整实例 之 图像边缘检测!从此在andrid中自由使用 图像匹配、识别、检测

    目录: 1,过程感慨: 2,运行环境: 3,准备工作: 4,编译 .so 5,遇到的关键问题及其解决方法 6,实现效果截图. (原创:转载声明出处:http://www.cnblogs.com/lin ...

  2. android studio 使用 jni 编译 opencv 完整实例 之 图像边缘检测!

    目录: 1,过程感慨: 2,运行环境: 3,准备工作: 4,编译 .so 5,遇到的关键问题及其解决方法 6,实现效果截图. ------------------------------------- ...

  3. ndk学习8: 编译动态库

    目录: 手工编译动态库 ndk-build编译动态库(Eclipse环境)   手工编译静态库 老规矩还是先手工操作,知其然并知其所以然   需要用到的核心命令: gcc -g -c -fpic -W ...

  4. 【转】实践最有效的提高Android Studio运行、编译速度方案

    原文:https://blog.csdn.net/xwh_1230/article/details/60961723 实践最有效的提高Android Studio运行.编译速度方案 最有效提升Andr ...

  5. Linux gcc编译(动态库,静态库)

    1. linux 库路径: /lib , /usr/lib , /usr/local/lib 2.linux 编译静态库 a.编写源文件vi pr1.c void print1(){    print ...

  6. studio_ 优化Android Studio 启动、编译和运行速度?

    http://www.admin10000.com/document/6842.html: 作为一名 Android 程序员,选择一个好的 IDE 工具可以使开发变得非常高效,很多程序员喜欢使用 Go ...

  7. 如何优化 Android Studio 启动、编译和运行速度?

    作为一名 Android 程序员,选择一个好的 IDE 工具可以使开发变得非常高效,很多程序员喜欢使用 Google 的 Android Studio来进行开发,但使用起来有时会出现卡顿等问题.本文介 ...

  8. gcc 动态编译 动态库路径

    gcc 动态编译(共享库) 动态编译的可执行文件需要附带一个的动态链接库,在执行时,需要调用其对应动态链接库中的命令优点:体积小,编译快缺点:依赖性高 代码如下: [root@74-82-173-21 ...

  9. Linux:编译动态库时遇到的错误relocation R_X86_64_32 against `a local symbol'

    编译动态库时遇到如下错误: ... ... relocation R_X86_64_32 against `a local symbol' can not be used when making a ...

随机推荐

  1. python全栈阶段测试(一)

    1.执行Python脚本的两种方式 如果想要永久保存代码,就要用文件的方式 如果想要调试代码,就要用交互式的方式 2.Pyhton单行注释和多行注释分别用什么? 单行注释:# 多行注释: '' &qu ...

  2. 【JAVASCRIPT】ECMAScrip (转)

    部分ECMAScript术语 ECMAScript Sun(现在的Oracle)公司持有着"Java"和"JavaScript"的商标.这就让微软不得不把自己的 ...

  3. jsp 重定向技术

    页面重定向之后,request对象的属性全部失效,生成一个新的requeset对象

  4. 移动端https抓包那些事--初级篇

    对于刚刚进入移动安全领域的安全研究人员或者安全爱好者,在对手机APP进行渗透测试的时候会发现一个很大的问题,就是无法抓取https的流量数据包,导致渗透测试无法继续进行下去. 这次给大家介绍一些手机端 ...

  5. 完整版ajax+百度echarts实现统计图表demo并随着窗口大小改变而自适应

    1.前言 百度Echarts会常用到我们的项目中做统计,api很详细,demo也非常之多,我们常用的是应有尽有了,做一些小项目的时候,百度echarts的demo已足够用了.今天呢.主要是跟小白讲一下 ...

  6. git分支管理之Bug分支

    软件开发中,bug就像家常便饭一样.有了bug就需要修复,在Git中,由于分支是如此的强大,所以,每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除. 当你接到一个修复一 ...

  7. POJ--1088--dp--滑雪

    #include<iostream> using namespace std; ; }; }; int dp(int,int); int row,col; int main() { whi ...

  8. web端常见安全漏洞测试结果分析-- appscan

    基于appscan测试结果分析: 一.XSS跨站脚本 指的是攻击者往Web页面里插入恶意html代码,通常是JavaScript编写的恶意代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被 ...

  9. java配置mongo最大连接数

    最近做压测,其中有个交易涉及到对mongo的操作. 单机压到1500UV的时候出现如下错误: 一看,原来是mongo配置的最大连接数不够: 我们来看看mongo的官方文档: connectionPer ...

  10. SpringBoot启动流程解析

    写在前面: 由于该系统是底层系统,以微服务形式对外暴露dubbo服务,所以本流程中SpringBoot不基于jetty或者tomcat等容器启动方式发布服务,而是以执行程序方式启动来发布(参考下图ke ...