
NDK的全称是Native Development Kit,即Android应用程序可以调用C语言写好的编程接口,不仅可以提高程序执行速度,也解决了有些底层函数java不支持的情况。
一.安装eclipse 开发环境。
首先要安装java sdk , 选下面的文件双击即可完成安装。
装好java sdk后,Eclipse 是不用安装的,直接进入eclipse文件夹运行eclipse.exe就可以执行了。
装好java后将java的安装路径添加到windows环境变量的Path中,以免后面调用javah是找不到命令。
二.安装Android sdk
安装ADT工具。ADT工具是一个eclipse的插件,专门用来进行Android开发。
a)打开eclipse,选择Help->Install New Software…
b)选择Add ,进行添加
c) 选择Archive , 再选择ADT-8.0.1.zip,我的电脑因为已经装过了,所以显示Duplicate location.之后点击OK即可。
d) 之后把几个选项前面的复选框全部选中,再点击下一步就好了,在下一步的操作中,要因为要分析一些依存性问题,所以可能比较慢,如果觉得很长时间也没反应,可以点击停止,重新再装ADT-8.0.1。
e)增加Android-sdk的路径
在eclipse菜单中选择Window->preference,左侧列表中选择Android , 在SDK Location中选择Android-sdk-windows 的路径,在列表出现下图相应的选项,即表示可用,最后点击ok即可。
三.安装android-ndk
1.安装cygwin
那个cygwin-store是自己安装时存储的文件,若是用这个文件安装不好用,那就选择从Internet上安装:
在下一步选择缓存的文件夹即可:
安装时Devel包必须要选Install,如下图示:
之后点击下一步,装好之后运行即可。运行时请确认一下make和gcc工具都好用。输入make –v和gcc –v查看显示正确即可。
2.安装android-ndk
把android-ndk-r3-windows.zip解压,把解压后的文件拷贝到c:/cygwin文件夹下面,具体路径请自己选择,我的是拷贝到C:\\cygwin\\program\\android-ndk-r3。
打开 ANDROID_NDK_ROOT=/program/android-ndk-r3 export ANDROID_NDK_ROOT 就是设置NDK的本地路径。 在cygwin中运行cd $ANDROID_NDK_ROOT 再运行 ./build/host-setup.sh 出现下图所示画面即表示安装成功。 四.用NDK编写Android程序。 1.建立AVD AVD就是一个Android虚拟设备,必须先建立一个AVD,用eclipse编写的代码才可以运行,建立方法: 点击eclipse工具栏上的Android小图标: 打开后左侧选择Virtual Devices , 右侧选择New 在target中必须选择Googlr APIs , Name 字段自己写即可,其他保持默认即可。 2.建立Android项目,选择File->New->Project,在下图中选择Android Project. 在新弹出的窗口中Name中输入项目的名称,这里用jnitest Build Target还是选择Google APIs,下面的Properties可以自己更改,其中package name是要打包好的java包的命名空间,都可以自己更改。 建好后程序的目录结构如图示: Main.java是主程序,AndroidManifest.xml是整个项目的配置文件,Main.xml是Android窗体的布局文件。 把Main.java的代码改成: package net.test.jni; import android.app.Activity; import android.widget.TextView; import android.os.Bundle; public class Main extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView tv = new TextView(this); tv.setText( stringFromJNI() ); setContentView(tv); } public native String stringFromJNI(); static { System.loadLibrary("jnitest"); } } 3.建立jni的C接口文件,用命令行进入jnitest的项目目录,进入其中的bin目录,输入javah –jni net.test.jni.Main ,前面的net.test.jni 是在建立项目输入的Package的名称,后面的Main表示Main.java文件。 输入命令后即可在当前目录下生成net_test_jni_Main.h文件,此文件定义了C语言函数的接口:JNIEXPORT jstring JNICALL Java_net_test_jni_Main_stringFromJNI (JNIEnv *, jobject);,此接口函数在后面的调用中会用到。 4.建立ndk下面的编译项目 在cygwin\\program\\android-ndk-r3\\apps下建立jnitest文件夹,并在此文件夹下建立Application.mk文件和project文件夹。 其中Application.mk中输入: APP_PROJECT_PATH:=$(call my-dir)/project APP_MODULES :=jnitest 其中APP_MODULES表示要生成的模块的名称。 再在project文件夹中建立jni文件夹,在jni文件夹下建立Android.mk和jnitest.c两个文件。 Android.mk中输入: LOCAL_PATH:=$(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE :=jnitest LOCAL_SRC_FILES :=jintest.c include $(BUILD_SHARED_LIBRARY) 其中LOCAL_MODULE还是生成模块的名称,LOCAL_SRC_FILES是编译模块需要的文件。 在jnitest.c中输入: #include #include JNIEXPORT jstring JNICALL Java_net_test_jni_Main_stringFromJNI ( JNIEnv* env, jobject thiz ) { return (*env)->NewStringUTF(env, "Hello from JNI !"); } 这个函数的声明格式是在第3步中生成的net_test_jni_Main.h中的内容。 这里格式都是固定的,jni.h是进行jni操作必须包括的头文件,JNIEXPORT JNICALL Java 都是固定的关键字,net_test_jni_Main_stringFromJNI 表示net.test.jni包下面的Main类里的stringFromJNI函数,JNIEnv* env, jobject thiz 是jni的固有参数,因为stringFromJNI函数的参数为空,所以生成的c函数就只有这两个参数。 return (*env)->NewStringUTF(env, "Hello from JNI !");的作用是把"Hello from JNI !"这个字符串作为返回值返回。 5.编译ndk项目 进入android-ndk-r3目录,运行make APP=jnitest 即可生成libjnitest.so文件,注意APP必须大写。 6.C库与java整合。 第5步编译好之后会在jnitest文件夹下生成一个lib文件夹,里面有libjnitest.so文件, 现在把整个lib文件夹拷贝到eclipse项目的根目录即可: 6.运行。 在eclipse左侧的列表中点右键选择“refresh”或按”F5”,这是防止文件不同步的问题。 在eclipse的菜单中选择Run->Run , 再在弹出的列表中选择Android Application , 点OK即可,模拟器启动成功后,把键盘解锁,程序会自动安装并运行,运行效果如下图: 第一次编译完后可能会出现程序崩溃的情况,多试几次或者关掉eclipse再启动可能会解决问题。 附: 若要导入已存在的eclipse项目,选择File->Import即可。
