一期学习:
一. 搭建环境
1、第一次搭建
(1)初步了解了ndk开发就是编写c/c++代码,然后用ndk编译,生成.so文件相当于windows下的.dll文件,不可以直接运行,最后用ndk工具将其与apk一起打包。第一次我选着单独安装每个软件,配置各个环境。
(2)ndk开发用到了eclipse-编辑代码,sdk-手机管理,adt插件-连接eclipse与avd模拟器,cdt插件-包含c/c++,ndk-编译c/c++代码和打包,jdk-eclipse所必须。
(3) 按照网上步骤安装和配置
(4)结果是sdk与adt不匹配,创建不了Android程序。后面更新了也不行。
2、第二次搭建
(1)采用集成开发工具ADT-bundle自带Eclipse、ADT插件和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工程,打开ndk下samples中的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
2、Android 文件系统映像文件用dnw下载不了时,重启系统就可以
 
                   
                   
                   
                   
                             
       
           
                 
                 
                 
                 
                 
                
               
                 
                 
                 
                 
                
               
                 
                 扫一扫
扫一扫
                     
              
             
                   196
					196
					
 被折叠的  条评论
		 为什么被折叠?
被折叠的  条评论
		 为什么被折叠?
		 
		  到【灌水乐园】发言
到【灌水乐园】发言                                
		 
		 
    
   
    
   
             
            


 
            