windows下用ADT进行android NDK开发的详细教程(从环境搭建、配置到编译全过程)

本文主要是介绍windows下用ADT进行android NDK开发的详细教程(从环境搭建、配置到编译全过程),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        郑重申明:如需转载本博客,请注明出处,谢谢!

        这几天在学习android NDK的开发,那么首先让我们来看看android NDK开发的本质是什么。

        NDK(Native Development Kit),即本地开发工具,简单地说,就是在开发android应用程序的时候,在java类中调用native函数,而native函数的接口也是在java类中定义的,但是native函数最终由本地的C/C++代码实现。简单地说,就是在java中调用C/C++函数。至于为什么要用NDK,我总结了一下,大致有以下几方面原因:

        1.提升程序运行效率:众所周知,在处理复杂运算或者对速度、内存要求苛刻的程序中,C/C++比java的效率要高出很多,比如人脸识别、OCR字符识别等图像处理程序,用C/C++实现无疑是首选。

        2.与硬件打交道:java之所以能跨平台,是因为所有的代码都是由JVM(java虚拟机)来解释的,这样就屏蔽了底层硬件体系结构的差异。但是如果我们的程序需要与底层硬件打交道,或者与驱动程序交互,那么就要用C/C++来写代码了。

        3.复用现有的程序:比如你有之前已经用C/C++实现了的程序,想移植到android平台上来,则可以直接通过NDK拿来用,不用再全部改写成java的。

        现在就来说说android NDK开发的一般步骤吧。

        一、准备工作:搭建android开发环境,包括jdk、ADT(新版的已经包含了eclipse IDE)、SDK等的下载安装,不会的自行百度,相关文章太多了,我在此不再赘述。

        二、在官网上下载NDK,网址:http://developer.android.com/tools/sdk/ndk/index.html。根据自己的操作系统平台(windows32或windows64或Linux或Mac)下载相应版本的NDK,然后双击解压到相应的文件夹。

        三、新建一个普通的android应用程序注意最小支持的API版本要>=14)。如果是新手,不清楚这个,可以百度、谷歌。

        四、在ADT开发环境中设置NDK的路径

               点击Window菜单,选择Preference,点击Android展开后点击NDK,设置NDK路径,点击Apply,如下图所示:


         五、添加Native Support

         右键工程,->Android Tools->Add Native Support。输入将要生成的.so文件的名字,点finish,如下图:


           六、设置C/C++的Paths and Symbols

         右键工程,->Properties,点击C/C++ General展开,点击Path and Symbols,在右边Includes下,点击Add,把NDK文件夹下的jni头文件和相应的C++头文件添加进来。这一步非常重要,否则会报错,详情请见我的另一篇文章:http://blog.csdn.net/u013149325/article/details/40371873


          七、在工程源文件的包中添加一个类,用于定义native函数接口,如下图:

          

          八、根据上一步中定义的接口,生成C/C++头文件

           可以用javah命令生成头文件,详见我的另一篇文章:http://blog.csdn.net/u013149325/article/details/40263413,我一开始也是在cmd窗口下用javah命令生成的,后来发现直接在ADT中配置相关选项,就可以生成头文件。不得不说现在ADT太强大了,如果你的ADT不支持相关功能,可以下载最新版本的。

           在菜单栏中点Run->External Tools->External Tools Configurations,右键Program->New,在右边的main子窗口配置如下图,Name可以自己随便取一个名字。


然后点Refresh,如下图勾选:

       

再点Common,勾选如下:


在菜单栏按钮下点javah,就可以发现在jni文件夹下面生成了.h头文件,如右图

    九、编写C/C++源文件,编译生成.so文件

        .so文件其实是Linux系统下的动态链接库,就相当于我们windows下的dll。而android系统是基于Linux的,所以会用到它。网上有很多人建议用Cygwin来生成.so文件,本人亲自实验也成功了,但是能在ADT集成开发环境里面自动生成会更加方便。

       编译工程后,在jni文件夹下面会生成一个与工程同名的.cpp文件,打开它,在这里面编写C++代码。如下图:


        这里面要包含上一步生成的.h头文件,然后在这里面实现native函数。如果不理解JNIEnv *、jclass、jintArry这些类型,可以深入学习JNI编程相关知识。如果你需要多个.h和.cpp文件,只要把它们都放在jni文件夹下就可以了。

        右键Project,Properties->Builders->New,新建立一个Builder。在弹出的对话框上面点击Program,点击OK,在弹出的对话框【Edit Configuration】中,配置选项卡【Main】,Location中需要填入nkd-build.cmd的路径(NDK安装目录下),WorkingDiretcoty中填入工程根目录。如下图:


   配置选项卡【Refresh】:勾选“Refresh resources upon completion”,勾选“The entire workspace”,勾选“Recuresively include sub-folders”,如下图:


   

配置选项卡【Build Options】: 勾选“After a “Clean””, 勾选“During manual builds”,勾选“During auto builds”,勾选“Specify working set of relevant resources”。如下图:


  在上图中,点击“Specify Resources…”勾选Test工程的“jni“目录,点Finish,再点OK保存。如下图:


      在工程的jni文件夹下面新建一个Makefile类型的文件,文件名为Application。(注:如果你不知道怎么新建Makefile类型的文件,可以把jni文件夹下的Android.mk文件在原地复制一份,然后重命名为Application。打开Application.mk之后修改里面的内容即可)。

         如下图:


编辑Application.mk文件,根据你的模拟器处理器类型和SDK级别增加如下两行,其中APP_ABI 指定处理器类型,可以指定多个。

     APP_ABI := armeabi-v7a
     APP_PLATFORM := android-19

       由于我们勾选了“During auto builds”,所以在工程有所改变的时候,so文件便会自动编译,正确生成以后就能在工程目录下发现多了一个libs文件夹,如下图:


       好了,android NDK程序的环境搭建配置、编译的详细流程到这里就结束了。我正在尝试android NDK中在C/C++源代码中设置断点跟进去调试,等我调试成功了就再写博客与大家分享。

这篇关于windows下用ADT进行android NDK开发的详细教程(从环境搭建、配置到编译全过程)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1119879

相关文章

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Spring AI集成DeepSeek的详细步骤

《SpringAI集成DeepSeek的详细步骤》DeepSeek作为一款卓越的国产AI模型,越来越多的公司考虑在自己的应用中集成,对于Java应用来说,我们可以借助SpringAI集成DeepSe... 目录DeepSeek 介绍Spring AI 是什么?1、环境准备2、构建项目2.1、pom依赖2.2

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

Goland debug失效详细解决步骤(合集)

《Golanddebug失效详细解决步骤(合集)》今天用Goland开发时,打断点,以debug方式运行,发现程序并没有断住,程序跳过了断点,直接运行结束,网上搜寻了大量文章,最后得以解决,特此在这... 目录Bug:Goland debug失效详细解决步骤【合集】情况一:Go或Goland架构不对情况二:

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

Ubuntu固定虚拟机ip地址的方法教程

《Ubuntu固定虚拟机ip地址的方法教程》本文详细介绍了如何在Ubuntu虚拟机中固定IP地址,包括检查和编辑`/etc/apt/sources.list`文件、更新网络配置文件以及使用Networ... 1、由于虚拟机网络是桥接,所以ip地址会不停地变化,接下来我们就讲述ip如何固定 2、如果apt安

SpringBoot中使用 ThreadLocal 进行多线程上下文管理及注意事项小结

《SpringBoot中使用ThreadLocal进行多线程上下文管理及注意事项小结》本文详细介绍了ThreadLocal的原理、使用场景和示例代码,并在SpringBoot中使用ThreadLo... 目录前言技术积累1.什么是 ThreadLocal2. ThreadLocal 的原理2.1 线程隔离2

Python itertools中accumulate函数用法及使用运用详细讲解

《Pythonitertools中accumulate函数用法及使用运用详细讲解》:本文主要介绍Python的itertools库中的accumulate函数,该函数可以计算累积和或通过指定函数... 目录1.1前言:1.2定义:1.3衍生用法:1.3Leetcode的实际运用:总结 1.1前言:本文将详

PyCharm 接入 DeepSeek最新完整教程

《PyCharm接入DeepSeek最新完整教程》文章介绍了DeepSeek-V3模型的性能提升以及如何在PyCharm中接入和使用DeepSeek进行代码开发,本文通过图文并茂的形式给大家介绍的... 目录DeepSeek-V3效果演示创建API Key在PyCharm中下载Continue插件配置Con