ndk开发步骤总结

一期学习:

一. 搭建环境

1、第一次搭建

1)初步了解了ndk开发就是编写c/c++代码,然后用ndk编译,生成.so文件相当于windows下的.dll文件,不可以直接运行,最后用ndk工具将其与apk一起打包。第一次我选着单独安装每个软件,配置各个环境。

2ndk开发用到了eclipse-编辑代码,sdk-手机管理,adt插件-连接eclipseavd模拟器,cdt插件-包含c/c++ndk-编译c/c++代码和打包,jdk-eclipse所必须。

(3) 按照网上步骤安装和配置

4)结果是sdkadt不匹配,创建不了Android程序。后面更新了也不行。

2、第二次搭建

1)采用集成开发工具ADT-bundle自带EclipseADT插件和SDK Tools,是已经集成好的IDE,只需安装好Jdk即可开始开发,步骤简单,特别适合初学者。

(2) 同样要装好eclipse必须先装jdk,并且配置好环境变量,可安装到任意目录,主要是配好环境,如图:

 

新建JAVA_HOME变量,值为:jdk安装目录;

新建CLASSPATH变量,值为:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar

在系统path中添加%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin就可以运行eclipes

3)安装android-ndk-r10b,配置环境在path里添加ndk安装目录,打开cmd,运行ndk-build出现如图信息,表示成功

 

 

android-ndk-r10b这个ndk就可以不用Cygwin(一个模拟linux环境的软件),一是windows的cmd里就可以运行ndk-build命令,二是可以直接加到eclipse中自动编译c代码。

(4) ecilpse中的windows->preferences->Androud->NDK中添加ndk安装目录,如图:

 

(5) 貌似可以了就试一试,新建android工程,打开ndksamples中的hello-jni例子,然后编译运行,结果为:

 

然后就只能各种找原因了,后面发现

 

Libs下的armeabi里没有.so文件,于是可能是没有调用ndk工具编译c文件,就没有生成.so文件,于是按照步骤新建了New_Builder1

 

,然后重新编译

 

 

这次就生成了.so文件,然后重新run,结果如下:

 

于是终于大功告成了

二期学习:

一、 开始自己编写第一个实例hellondk

1、新建android工程

 

 

第一次看见工程结构图是这样的。

 

2、编写MainActivity.jav

然后在MainActivity.jav里添加一个native方法public static native String GetString();,会从底层获取一个字符串。

3、新建一个jni额文件夹,关键来了,要用javah命令在jni里生成头文件,个人理解:这个头文件肯定与刚才自己写的方法GetString()函数有关,自动生成某种格式可以被java代码调用。

 

4、打开cmd开始生成头文件

先测试一下javah可用吗?

 

我的显示java可用,javah不用,环境变量path也没问题,就是javah不行,折腾了几个小时,最后发现只要用set path= D:\Java\jdk1.8.0_05\bin就好了

 

然后就开始定位到工程目录下,编译头文件

 

bin/classes后添加;D:\adt-bundle-windows-x86-20140702\sdk\platforms\android-15就可以了

 

 

看到jni目录多了com_example_hellondk_MainActivity.h,添加成功。

然后添加hellonak.c文件添加具体的方法,添加Android.mk文件并修改。

 

ndk-build编译hellondk.c文件

 

最后再模拟器中运行结果为:

 

 

三期学习:

验证实例:
首先从简单入手,从LED灯开始,用eclipse打开9.4-ndk_led实例,连接真机(打开平台里的手机里的USB调试即可),点击Run->Android Application,

结果偏偏出现:

 

然后查看文件列表中没有.so文件,需要用ndk编译,然后新建一个New_Builder,进行编译。

 

然后成功运行:

 

但伤心的是点击屏幕,LED灯没有任何反应。

然后查看是否安装了驱动,检查后确实没安装,查看说明书,可以将含Led_driver的image文件重新烧录一遍,然后打开终端,执行以下命令:

 

然后重新调试程序,就可以看见能够通过触屏控制LED的亮灭了。如图:

 

突然觉得每个驱动程序都要程序烧入image吗?那调试驱动程序不就太辛苦了。

如何简单加载驱动程序:

 

四期学习:

一、

Android.mk理解:

Android.mk文件语法允许我们将Source打包成一个"modules". modules可以是:

 

静态库

 

动态库。

 

 

只有动态库可以被 install/copy到应用程序包(APK). 静态库则可以被链接入动态库。

 

 

LOCAL_PATH := $(call my-dir)

 

每个Android.mk文件必须以定义LOCAL_PATH为开始。它用于在开发tree中查找源文件。

 

宏my-dir 则由Build System提供。返回包含Android.mk的目录路径。

include $(CLEAR_VARS)

 

CLEAR_VARS 变量由Build System提供。并指向一个指定的GNU Makefile,由它负责清理很多LOCAL_xxx.但不清理LOCAL_PATH.

LOCAL_MODULE    := libleds_hal编译后的模块名

LOCAL_SRC_FILES := leds_v210_hal.c编译需要的源文件

LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog编译模块时要使用的附加的链接器选项。并有调试信息

include $(BUILD_STATIC_LIBRARY)编译成静态链接库

LOCAL_MODULE    := libledsctrl_jni

LOCAL_SRC_FILES := com_android_emobile_LedDevice.c

LOCAL_STATIC_LIBRARIES := libleds_hal表示该模块需要使用哪些静态库,以便在编译时进行链接。

include $(BUILD_SHARED_LIBRARY) 最终编译成都能动态链接库

libledsctrl_jni.so内容:

 

System.loadLibrary()是我们在使用Java的JNI机制时,会用到的一个非常重要的函数,它的作用即是把实现了我们在Java code中声明的native方法的那个libraryload进来,或者load其他什么动态连接库。

native方法是指本地方法,当在方法中调用一些不是由java语言写的代码或者在方法中用java语言直接操纵计算机硬件时要声明为native方法.

编译模块后安装时失败,一般是内核不吻合。

二、

1、如果dnw不能用了,在C盘根目录下,删掉dnw的配置文件dnw.ini

2Android 文件系统映像文件用dnw下载不了时,重启系统就可以

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值