NDK开发环境配置及HelloJni基本开发步骤

本文引用 博客 http://www.cnblogs.com/baronzhao/archive/2012/07/10/2585181.html,增加了开发步骤,及配置中遇到的问题和解决方法

主要内容

1、  Android NDK 安装

2、  安装Cygwin与使用NDK编译

3、  在Eclipse中集成C/C++开发环境CDT

4、  安装Sequoyah插件

5、  JNI编译环境配置

6、  开发步骤

 

本文建立在已经完成Android开发环境搭建的基础上。其基础环境至少需要包含以下内容:

1、  JDK

2、  Eclipse

3、  Android SDK and ADT

可以参考我之前的“Android开发环境搭建”。

一、Android NDK 安装与配置


NDK简介
NDK全称:Native Development Kit
①.NDK是一系列工具的集合。
    * NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。
    * NDK集成了交叉编译器,并提供了相应的mk文件隔离平台、CPU、API等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等)
,就可以创建出so。
    * NDK可以自动地将so和Java应用一起打包,极大地减轻了开发人员的打包工作。

②、NDK提供了一份稳定、功能有限的API头文件声明。
从版本的NDK中看出,这些API支持的功能非常有限,包含有:C标准库(libc)、标准数学库(libm)、压缩库(libz)、Log库(liblog)

 ③NDK带来什么
     NDK的发布,使“Java+C”的开发方式终于转正,成为官方支持的开发方式。
    使用NDK,我们可以将要求高性能的应用逻辑使用C开发,从而提高应用程序的执行效率。使用NDK,我们可以将需要保密的应用逻辑使用C开发。
毕竟,Java包都是可以反编译的。NDK促使专业so组件商的出现。

    使用NDK的优点:

保护代码

代码重用。

C运行速度快

可手动分配内存,如视频


     Android NDK 是在SDK前面又加上了“原生”二字,即Native Development Kit,因此又被Google称为“NDK”。在此之前,Android平台的第三方应用程序
均是依靠基于Java的Dalvik特制虚拟机进行开发的。原生SDK的公布可以让开发者更加直接的接触Android系统资源,并使用传统的C或C++语言编写程序,
并在程序封包文件(.apks)中直接嵌入原生库文件。

下载Android NDK。下载地址:http://developer.android.com/tools/sdk/ndk/index.html

下载后解压缩到你的工作目录,例如"E:\android\android\android-ndk-r9",再把这个路径添加到系统的环境变量PATH中。

注意:samples下面包含几个实例开发演示项目,第一次接触NDK开发,建议先从示例开始。

      docs内是技术文档,英语能力强的可以研究研究。

二、安装Cygwin与使用NDK编译

    由于NDK开发大都涉及到C/C++在GCC环境下编译、运行,所以在Windows环境下,需要用Cygwin模拟Linux编译环境。

    Cygwin是一个在windows平台上运行的类UNIX模拟环境,它对于学习UNIX/Linux操作环境,或者从UNIX到Windows的应用程序移植,或者进行某些特殊的开发工作,尤其是使用GNU工具集在Windows上进行嵌入式系统开发,非常有用。
  

    Cygwin的主要目的是通过重新编译,将POSIX系统(例如Linux、BSD,以及其他Unix系统)上的软件移植到Windows上。

下载:

Cygwin的下载地址:http://www.cygwin.com/

点击右上角的“setup.exe”即可下载。

安装:

第一步:运行setup.exe程序,直接点击Next进入下一步。

第二步:选择安装方式。第一次可以采用Direct Connection在线下载安装,如有现成的离线包,可以选择离线安装(Install from Local Directory)。

第三步:选择安装目录。比如D:\Java\Cygwin,注意此目录是指Cygwin最终的安装目录,不是下载文件暂存目录。

第四步:设置本地包暂存路径。暂存目录默认是放到setup.exe的同级目录下,建议放到指定的文件夹,如D:\Cygwin_install_file。安装完成后把这个文件夹打包备份,以后再配置时不用重新下载。

第五步:设置网络连接方式。这个目前河蟹没爬过来,选第一个即可。

第六步:选择下载站点地址。据说国内163站点的速度不错,我也是用的这个。

第七步:等待加载安装项载入,选择安装项。点击Devel-Default,使之变成Devel-Install,展开后可以看到其下的子项被选中了(网上多数教程都说选中某12个包,找起来太坑爹了,直接全下载了吧,全选多了150M左右)。此界面其他设置都不用动。

第八步:等待下载完成。下载完成时间决定于你选择的安装包数量及网络连接速度,安装我安装的版本,约983M,下载完成后会自动安装到上文设置的安装目录,安装也要时间的,总时间较长,去吃个饭没啥问题。

提醒:第四步的备份建议,尽量去做。如果有备份,第二步中选择离线安装。

验证:

运行安装目录下的“Cygwin.bat”,第一次运行时,它会自动创建用户信息,用户信息存放在“.\Cygwin\home”中。

在运行“Cygwin.bat”打开的命令行窗口输入:“cygcheck -c cygwin”命令,会打印出当前Cygwin的版本和运行状态,如果status是ok的话,则cygwin运行正常。

分别输入:“make –v”和,“gcc –v”命令如果检测成功,会有make和gcc相关版本信息打印出来。

设置路径:

假设安装在"C:\cygwin"下,将"C:\cygwin\bin"添加到系统环境变量PATH中,为了方便的在命令行下调用Android NDK,找到"C:\cygwin\home\(你的用户名)"这个目录,打开文件".bash_profile",在文件的最下面加上下面两行内容:

NDK=/cygdrive/e/android/android/android-ndk-r9
export NDK

这样便可以在命令行中以 "$NDK/ndk-build" 这种形式调用NDK了。

【注意“$”符号,不能忘记输入】

         运行Cygwin命令行,可以直接使用此环境变量,当然也可以手动的cd到该目录:

          

使用NDK编译程序:

现在我们用安装好的NDK来编译一个NDK提供的sample程序hello-jni(我的目录位于:D:\Java\android-ndk-r8\samples\hello-jni)。

         第一步:运行Cygwin,配置环境变量后可输入“cd $NDK/samples/hello-jni/”,未配置则输入命令“cd /cygdrive/e/android/android/android-ndk-r9/samples/hello-jni”,进入到“hello-jni”工程目录。


         第二步:编译。输入命令“$NDK/ndk-build”命令即可编译。ndk-build是调用ndk的编译程序。

 

         第三步:到”…/hello-jni/libs/armeabi“目录下看有没有生成的.so文件,如果有,你的ndk就运行正常啦!

         

导入NDK的hello-jni示例到Eclipse中:

         第一步:在Eclipse中新建一个Android工程HelloJni。在Create Android Project时勾选“Create project from existing source”,Location中填“D:\Java\android-ndk-r8\samples\hello-jni” (注意:在选择API level时需要选择1.5或更高的版本)。

         第二步:直接以Android Aplication运行。这里要注意,你之前在使用NDK编译程序时要把这个hello-jni编译过并产生了.so文件,此处才能运行起来。

 

三、在Eclipse中集成C/C++开发环境CDT

         CDT的安装可以使我们在一个工程中,同时开发基于C/C++的Native代码和基于Java语言的壳,之后的配置还可以使得一次编译两部分代码。

下载:

         下载地址:http://www.eclipse.org/cdt/downloads.php

说明:

Eclipse C/C++ IDE Indigo SR2:是带CDT的Eclipse开发环境。

p2 software repository:在线安装的地址。(似乎被河蟹爬了)

cdt-master-8.0.2.zip:这个是CDT的离线安装包。(推荐使用这个,保留离线包,复用)

离线安装:

         Eclipse -> Help -> Install New Software,点击add。Name:随意,建议使用好记的“CDT_版本”。Location:点击Archive,定位到下载的“cdt-master-8.0.2.zip”文件。

         错误:

如果Location的下面出现“Duplicate location”错误,请到Window -> preferences -> Install/Update -> Avaliable Software Site中找到该条,remove之。

验证:

         安装完成后,在Eclispe中新建一个项目,如果出现了C/C++项目,则表明CDT插件安装成功了。

 

四、安装Sequoyah插件

Sequoyah插件用于设置Android工程对Native开发的支持。

官方网址:http://www.eclipse.org/sequoyah/downloads/

在线安装:

         官网提供了用于在线安装的Update Site地址以及安装包的下载地址。貌似安装包才1M多,在线安装也没被河蟹爬过,直接在线安装了。勾选全部列出的可安装项并完成安装。

Location:http://download.eclipse.org/sequoyah/updates/2.0/

 

注意:

在安装界面不要勾选“Group items by category”复选框,默认是勾选的,出现了列表为空(There are no categorized items)的情况。

 

配置:

         安装完Sequoyah插件后,为Android配置NDK路径。

         在“window –> preferences ->Android -> 本机开发”中添加NDK的路径。

 


    【注:这个插件目前仅支持ndk的r4和r5版本,更高版本会提示这个路径无效。其实,插件只是需要这个参数向PATH中添加这个路径,但是不设置这个路径会导致插件工作不正常。

        解决方法是,手动创建以下文件:(NDK目录)\toolchains\arm-eabi-4.4.0\prebuilt\windows\arm-eabi-4.4.0\bin\gcc.exe  从第二级目录开始可能就是不存在的,最后的gcc.exe可以是0字节,如建立txt文件后改名gcc.exe即可。这样插件就配置完成了。

验证:

         右键之前建立的“HelloJni”项目,在“Android Tools”选项中包含“Add Native Support…”选项即成功。

五、JNI编译环境配置

         仍旧以之前建立的“HelloJni”为例,到目前为止,如果我们修改“/HelloJni/jni/hello-jni.c”文件,动态链接库libhello-jni.so文件却不会被重新编译生成。这是因为我们没有给JNI项目添加它需要的编译配置和依赖库。现在我们来配置它。

         第一步:转换工程。点击“文件 -> 新建 -> 其他”(快捷键:Ctrl+N)。选择“C/C++”下的“Convert to a C/C++ Project(Adds C/C++ Nature)”。进入“下一步”。

 

         第二步:选中你刚才建的“HelloJni”工程,下面左边选“Makefile project”右边选“Cygwin GCC”。确定后提示的“透视图”不清楚是什么,点击“是”即可。

 

         第三步:在“HelloJni”工程上右键,选择“属性”。配置“C/C++ Build”和“C/C++ General ->  Paths and Symbols”。

         C/C++ Build:点击“C/C++ Build”,在右边的“Builder Settings”中去掉默认勾选的“Use default build command”复选框。设置Build command为“bash D:\Java\android-ndk-r8\ndk-build”。

         C/C++ General ->  Paths and Symbols:在Includes下add新的GNU C依赖路径。此“HelloJni”工程需要“D:\Java\android-ndk-r8\platforms\android-8\arch-arm\usr\include”即可,以后根据不同项目选择不同的依赖库。 

 

验证:

         将“/HelloJni/jni/hello-jni.c”中的字符串“Hello from JNI !”如改为“Hello JNI from Baron!”,运行后在模拟器上输出的字符串改变即说明配置成功。 

【注:Cygwin1.7版本和Eclipse中CDT插件的问题

Eclipse是一款比较出名的IDE,功能强大,可以用来做C\C++开发。Eclipse开发C\C++,需要用到CDT插件,就可以利用Cygwin开发一些linux移植windows的开发,或者交叉编译(微软的VC编译器不提供此功能)。如今比较火爆的Android NDK开发,如果在windows平台下就必须使用Cygwin。而且CDT插件使用注册表发现Cygwin软件的安装位置,如果使用Eclipse软件开发的话,Cygwin在安装的时候就不用配置任何的环境变量,非常方便。
但是随着Cygwin更新到1.7,CDT插件工作开始不正常,最明显的两个症状是:1.console无输出,2.按住ctrl点击,很多标准对象找不到对应的头文件。
解决方法:打开eclipse,windows->preferences->C\C++->Debug->Source Lookup Path,点击Add,添加一个Path Mapping,名字可以随意取,比如Cygwin Path Mapping;假设Cygwin安装在C盘,将/cygdriver/c映射到C:\,确定保存以后,重启Eclipse,以前的ctrl点击,控制台输出就正常了。
此方法出处来自于CDT插件的FAQ,具体网址是参见扩展阅读。原理非常简单,因为Eclipse是一个跨平台的编译器,所以CDT插件在磁盘上找文件的时候也是采用的unix风格的路径,所以在windows上无法正常工作,做一个路径映射,将Cygwin所在磁盘的路径映射为windows风格的路径,CDT就可以正常的发现头文件了。】

六、开发步骤



1.创建android工程,编写声明native方法的java类;
  如创建一个HelloJni.java 文件,并编写代码.
  包含要点  
    static {
        System.loadLibrary("hello-jni");
    }
   使用NDK编写的代码 最终都会编译成.so库文件。上面的static 代码块的作用就是将我们编译出的库文件加载进来。表明程序开始运行的时候会加载hello-jni, static区声明的代码会先于onCreate方法执行。如果你的程序中有多个类,而且如果HelloJni这个类不是你应用程序的入口,那么hello-jni(完整的名字是libhello-jni.so)这个库会在第一次使用HelloJni这个类的时候加载。
    同样需要注意的是, 如果你的文件名字为libhello-jni的时候, 他生成的库文件不是liblibhello-jni.so 而一样是libhello-jni.so。


   public native String StringFromJni();  native函数声明


   tv.setText(StringFromJni());  native函数调用


2.eclipse编译该工程,生成相应的.class文件,这步必须在下一步之前完成,因为生成.h文件需要用到相应的.class文件
 我们也可以自己编译该文件。进入终端 进入工程所在的目录。javac src/com/example/HelloJni.java -d bin/class (如果没有该目录就需要我们自己建立 mkdir -p bin/class)。


3.编写C/C++代码,实现native函数
  ①用javah 自动生成.h的头文件,里面包含所有函数名 
  进入bin/class 目录 cd bin/class
Administrator@Ding_Jinzhu /cygdrive/e/android/android/android-ndk-r9/samples/hello-jni/bin/classes
$ javah -classpath "E:\android\android\android-sdk-windows\platforms\android-8\android.jar;." -d ../../jni  com.example.hellojni.HelloJni
  生成.h文件位于samples\hello-jni\jni 目录下


[注:JavaH使用问题:无法访问android.app.Activity ,可以在-classpath参数里指定多个目录,用分号分开,包含android.jar包路径和当前编译类所在路径:]


  ②编写实现此头文件的C文件com_example_hellojni_HelloJni.h


  
  ③编写Android.mk 文件 熟悉linux编程的同学对makefile肯定都比教熟悉
 
LOCAL_PATH := $(call my-dir)  
  
include $(CLEAR_VARS)  
  
LOCAL_MODULE    := hello-jni  
LOCAL_SRC_FILES := com_example_hellojni_HelloJni.c  
  
include $(BUILD_SHARED_LIBRARY)  
其中:
LOCAL_MODULE := hello-jni 中的hello-jni  就是我们指定的编译的库文件的名称。(最后生成的文件名字是libhello-jni.so 在我们指定的名称前添加lib)


LOCAL_SRC_FILES := com_example_hellojni_HelloJni.c  指定我们编译的源文件
include $(BUILD_SHARED_LIBRARY) 指定我们最终生成共享库


4.NDK编译环境全部配置OK后,可直接运行eclipse,打包so库和java应用,输出Hello from JNI 
  或者在cygwin中进入工程目录,运行$NDK/ndk-build,生成so库,然后编译运行Android程序;


附:g++的几个编译命令

$ g++ -c MathFuncsLib.cpp  编译生成.o目标文件

$ ar -crv libmathfunc.a MathFuncsLib.o  生成.a静态库文件

$ g++ -o Test Test.cpp libmathfunc.a  调用静态库生成可执行文件

运行一下哈
$ ./Test 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值