一、 Android NDK r5安装
1、 cygwin的安装和简单配置
① 首先到 http://www.cygwin.com下载setup.exe ,接着建立安装目录,如X:/cygwin (我用的是 E :/cygwin ) ,将setup.exe放到此目录。
② 启动安装:
BEGIN-> 点击setup.exe:
③ Next->选Install from Internet(选择在线安装方式):
④ Next->填写Root Directory,如X:/cygwin(选择安装路径):
⑤ Next->填写Local Package Directory,如X:/cygwin/ftp(选择下载文件存放的目录):
⑥ Next->选Direct Connection(选择网络连接方式):
⑦ Next->选一个较快的ftp(选择下载镜像站点):
加入上海交大的ftp,点下一步,下载组件,这中间可能会有一些警告信息,说什么setup.exe和setup.ini版本不匹配,这个不用管,继续安装。
(上海交大ftp :ftp://ftp.sjtu.edu.cn/sites/cygwin.com/pub/cygwin/)
⑧ Next->(开始下载安装):
⑨ 到了关键步骤,如果仅想安装基本系统,直接Next;如果想完全安装,点击 All旁边的旋转状图标,将Default切换至Install;如果仅想在命令行下写写程序,则只要将gcc、make等开发工具选上,还有openssh等(一般选择: autoconf2.1 、 automake1.10 、 binutils 、 gcc-core 、 gcc4-core 、 gdb 、 pcre 、 pcre-devel 、 GNU awk );选好后,Next->:
NDK需要的make和gcc在该节点下
可以在search框中搜索要按安装的组件名,然后选中;也可以根据分组,自己展开选中。
Vim和Emacs在Editor那一组,选中即可
Gcc 在 下图红框标出的Devel一组,必须安装的组件有
binutils
gcc
gcc-mingw
gdb
⑩ 选择需不需要创建快捷方式。->END
最后启动Cygwin,测试安装是否成功:
点击快捷方式或X:/cygwin/cygwin.bat打开控制台,如果是域用户,按照提示makepasswd和makegroup即可。
输入命令检查
出现以上版本信息则表明make 和gcc 已经安装成功。
2、 Android NDK r5 windows
① 首先到官网下载 Android NDK r5 windows
② android-ndk-r5直接解压就行了,我的路径是E:/Android_NDK
③ 在home/<你的用户名>/.bash_profile 文件中最后添加环境变量 :打开E:/cygwin/etc/skel目录,找到 .bash_profile 文件 ,拷贝到 home/<你的用户名>/ (此处为E:/cygwin/home/Administrator)下面,在 最后添加环境变量
NDK=/cygdrive/<你的盘符>/
export NDK
我的:NDK=/cygdrive/E/Android_NDK/android-ndk-r5
export NDK
其中"NDK"这个名字随便起,因为后面要用经常使用,建议不要太长。
重启cygwin,输入cd $NDK进入对应目录,就成功了。
注意:添加时用UltraEdit打开添加,如果是中文OS 使用记事本或者写字板打开编辑后,重新启动Cygwin 会报错。可以按照下图方式转换:
二、 JNI实例
1、 安装成功后编译NDK中的一个例子命令行:
编译完成后在E:/Android_NDK/android-ndk-r5/samples/hello-gl2文件夹中会生成一个文件夹libs,里面有一个子文件夹armeabi,里面生成libgl2jni.so文件 。
2、 一个简单的JNI例子
下面用一个简单的例子介绍怎么生成一个.so文件以及在Android项目中怎么调用.so文件。
① 首先,用Eclipse建立一个ANDROID的工程,命名为MyFirstJNI,工程代码为:
② 制作生成.so文件: 可以通过获取以.h文件 来 获取函数申明。打开命令行,键入cd (这个路径是使用Eclipse建立的工程目录的src的路径,我的是F:/workspace/MyFirstJNI/src ),目的是设置工程目录。然后键 入: javah -jni com.cn.lhq.JniTest,结果如果失败,那就是因为没有把MyFirst.class文件拷贝到 F:/workspace/MyFirstJNI/src /com/ cn/lhq 之下,原因是Eclipse的文件管理机制会将.class文件和.java文件分开到不同的目录,解决方法是将F:/workspace/MyFirstJNI/bin/com/cn/lhq的所有.class文件都拷贝到他的目录下面。再次运行javah -jni com.cn.lhq.JniTest即可。然后就可以看到在 F:/workspace/MyFirstJNI/src 下多出了一个文件:com_cn_lhq_JniTest.h,通过这个文件,我们就知道了本地接口的函数名,于是我们就根据函数名写一个com_cn_lhq_JniTest.c文件, 代码如下:
注意 : 这个函数的参数与用javah生成出来的参数是不同的,这里只是需要函数名而已,因为函数名必须匹配,否则在模拟器上面跑的时候会出错,当然,如果对JNI命名规则熟悉的话可以跳过javah这步,直接写一个.c文件。
写好.c文件之后就开始生成 .so 文件了,这时候需要 用到 ANDROID.MK这个文件。于是把Eclipse生成的工程目录剪切,放到NDK目录的samples目录之下 (和示例hello-gl2一样),这个时候模仿hello-gl2文件层次结构,将MyFirstJNI文件也做成那样 :在MyFirstJNI文件夹下面新建一个 jni文件夹,把 com_cn_lhq_JniTest.c 剪切到此文件夹中,同时也拷贝一个 ANDROID.MK 文件到此文件夹,用 UltraEdit打开 ANDROID.MK 文件进行修改,主要修改如下:
LOCAL_MODULE := 工程名
LOCAL_SRC_FILES := .c的文件名(包含扩展名)
此例子应改为:
LOCAL_MODULE := MyFirstJNI
LOCAL_SRC_FILES := com_cn_lhq_JniTest.c
然后 打开 cygwin, 输入cd $NDK (NDK为前面环境变量那设定的名字)
然后输入 make APP=MyFirstJNI
如果出现下面的错误说明你快要成功了:
$ make APP=MyFirst
Android NDK: Application MyFirst targets platform 'android-8'
Android NDK: which is not supported by this release of the Android NDK
build/core/add-application.mk:76: *** Android NDK: Aborting... . Stop.
因为你使用的是2.2版本的SDK所以检查的时候有问题,做法是:除了将jni文件目录保留,别的文件和目录都剪切到别的地方,然后再make APP=MyFirst
成功之后,再把这些前面的东西拷贝回来。
③ 在eclipse中重新导入生成了.so文件的 MyFirstJNI项目,运行效果图如下:
- #include <string.h>
- #include <jni.h>
- jstring
- Java_com_cn_lhq_JniTest_stringFromJNI( JNIEnv* env,
- jobject thiz )
- {
- return (*env)->NewStringUTF(env, "Hello from JNI !");
- }
- package com.cn.lhq;
- import android.app.Activity;
- import android.os.Bundle;
- import android.widget.TextView;
- public class JniTest extends Activity {
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- // setContentView(R.layout.main);
- TextView tv = new TextView(this);
- tv.setText(stringFromJNI());
- setContentView(tv);
- }
- public native String stringFromJNI();
- static {
- System.loadLibrary("MyFirstJNI");
- }
- }