Android NDK开发入门实例

        写这个,目的就是记录一下我自己的NDK是怎么入门的。便于以后查看,而不会忘了又用搜索引擎一顿乱搜。然后希望能够帮助刚学的人入门。先转一段别人说的话:

“NDK全称:Native Development Kit。

1、NDK是一系列工具的集合。

* NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。这些工具对开发者的帮助是巨大的。

* NDK集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。

* NDK可以自动地将so和Java应用一起打包,极大地减轻了开发人员的打包工作。

2、NDK提供了一份稳定、功能有限的API头文件声明。

Google明确声明该API是稳定的,在后续所有版本中都稳定支持当前发布的API。从该版本的NDK中看出,这些API支持的功能非常有限,包含有:C标准库(libc)、标准数学库(libm)、压缩库(libz)、Log库(liblog)。”

在深入理解之前,暂且就把NDK当成是一种工具,这种工具使得JAVA能够使用C/C++编译出的so包。并将此包一起打入apk包中。

下面开始正式入门:

一、开发环境搭建(以Windows平台下为例,Linux平台下类似)

1.      下载NDK压缩包,至于从哪里下载借助搜索引擎吧。

2.       解压NDK压缩包,配置环境变量。将解压的地址写入环境变量PATH中

3.       在命令提示符下输入ndk-build如果弹出如下的错误,而不是说ndk-build not found,就说明ndk环境已经安装成功了。特别提示一下,搜索引擎中会告诉一些早期的NDK版本的使用,是在命令提示符下输入build/host-setup.sh;但是NDK经过更新,这个文件已经没有了。只需要输入ndk-build就可以了。

Android NDK: Could not find application project directory !    
Android NDK: Please define the NDK_PROJECT_PATH variable to point to it.    
/home/braincol/workspace/android/android-ndk-r5/build/core/build-local.mk:85: *** Android NDK: Aborting    .  Stop.

4.       cygwin的安装,至于如何安装,从哪里安装也去借助搜索引擎吧。在Cygwin安装过程中,可能比较慢,必须安装的项目有make和gcc;建议安装下面几个包:autoconf2.1 ,automake1.10 ,binutils ,gcc-core ,gcc4-core ,gdb ,pcre ,pcre-devel,都安装最新版本。安装完毕后,运行Cygwin,输入"make -v"和"gcc -v"来检测是否安装成功;make版本要在3.81以上。

5.       以上任务结束后,就表示基本的开发环境搭建完成了。

二、编写JAVA代码

1.       建立一个android的工程HelloJni,创建MainActivity.java文件。

MainActivity.java:


package com.my.hellojni;

 import android.app.Activity;

 public class MainActivity extends Activity {
 private TextView display; 
 @Override
 public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 display = (TextView) findViewById(R.id.display);
 exe();
 }

 public void exe(){
 Utils utils = new Utils();
 display.setText(utils.stringFromJNI()
 +" 10+5="+String.valueOf(utils.add(10, 20))
 +" 10-5="+String.valueOf(utils.sub(10, 5))
 +" 10*5="+String.valueOf(utils.multi(10, 5))
 +" 10/5="+String.valueOf(utils.div(10, 5)));
 }

 }
 
 
  Uitls.java
 
 

 package com.my.hellojni; 

 public class Utils { 

 public native String stringFromJNI(); 

 public native double add(double a, double b); 

 public native double sub(double a, double b); 

 public native double multi(double a, double b); 

 public native double div(double a, double b); 

 static { 

 System.loadLibrary("hello-jni"); 

 } 

 }



编译一下工程 (即:运行一下工程,会报错,不用管)

  运行命令   开始--》运行----》cmd

找到工作空间下该项目 E:\myroot\bwandroidspace\HelloJni>

输入 javah -classpath bin/classes -d jni com.my.hellojni.Uitils


Andorid中vendo库链接system库 andorid sdk_搜索引擎


这时在工程里就会生成jni文件夹,里面有.h文件


打开.h文件  周到对应的方法


Andorid中vendo库链接system库 andorid sdk_android_02




根据对应的方法写.C文件


Andorid中vendo库链接system库 andorid sdk_android  JNI_03


写好.C文件后在配置的ndk线面找到  E:\android-ndk-r7\samples\hello-jni\jni

下的 Android.mk文件复制到你工程中的jni文件夹中

打开Android.mk文件

Andorid中vendo库链接system库 andorid sdk_搜索引擎_04


更改对应的LOCAL_MODULE    和   LOCAL_SRC_FILS(次例子中不用更改,因为引用类库名也是hello-jni)

改好后

打开Cygwin  找到对应的路径   cygdrive/e/myroot/bwandroidspace/HelloJni

输入 :

Andorid中vendo库链接system库 andorid sdk_搜索引擎_05


这事重新打apk包就成功了!