懒得废话一大堆概念,关于ADT、NDK的概念要是你不懂,怎么会搜到这里来?因此你只须要根据下面的步骤来,就能够完成NDK环境搭建了。java
步骤:(假设你未安装任何相关开发工具,若是已经安装了,就能够跳过)android
一. 环境搭建windows
1. 安装 jdk
安装完毕后配置好环境变量(我安装的是jdk1.7)
JAVA_HOME = C:\Java\jdk1.7.0_51
PATH = C:\Java\jdk1.7.0_51\bin
CLASSPATH = .;%JAVA_HOME%/lib/dt.jar;%JAVA_HOME%/lib/tools.jarapp
能够打开 cmd 后 输入:java -version 检查到底安装成功没。eclipse
2. 安装 eclipse 和 adt
安卓官网已经将adt集成到了eclipse中,以前在线安装adt的过程简直是惨不忍睹。
在安卓官网上下载集成包,我下载的是 adt-bundle-windows-x86_64-20140624.zip
我把 这两个文件分享在了百度云盘能够下载:http://pan.baidu.com/s/1kTA4vn5
下载后建议解压在 D:\Android 目录,也能够选择别的目录。
集成包解压后在 D:\Android 下将有两个目录和一个文件:
eclipse : eclipse 目录
sdk :安卓sdk目录,里面只有4.4的包
SDK Manager.exe : SDK管理器,能够用来下载别的版本的开发包,国内访问常常被拒绝,绕过的方法能够上网搜。
3. 安装NDK
在安卓官网上下载 NDK 压缩包而且解压。须要注意的是NDK目录不得有空格,建议依旧解压到 D:\Android
我下载的版本是 android-ndk-r9d-windows-x86_64.zip
r7版本以后能够直接使用ndk-build命令完成编译,因此没必要安装cygwin环境。
配置环境变量path:
在path 中加入 NDK的安装目录,好比:D:\Android\android-ndk-r9dide
保证在打开 cmd 后,输入 ndk-build 显示以下提示。函数
而不是找不到 ndk-build 这条命令!工具
二. TestNDK开发工具
1. 创建新的安卓工程:TestNDK
向导在建立应用的时候 默认的包 前缀是 com.example ,不必更改。因此最后的包名为:com.example.testndk
建立一个启动Activity,就叫 TestNDK (非要叫MainActivity的话,后面记得更改)
ps: 我建立的时候,选择建立Activity结果没有反应,只能建立一个java文件。这时记得在 AndroidManifest.xml 里面的application标签下加上:ui
<activity android:name="com.example.testndk.TestNDK" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> 、
</intent-filter> </activity>
不论是用向导仍是直接新建java文件,最后用下列代码覆盖 TestNDK.java 文件:
package com.example.testndk; import android.app.Activity; import android.widget.TextView; import android.os.Bundle; public class TestNDK extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView myTextView = new TextView(this); myTextView.setText( stringTestNdk() ); setContentView(myTextView); } public native String stringTestNdk (); public native String stringTestNdk2 (); static { try{ System.loadLibrary("testNDK"); }catch(UnsatisfiedLinkError ule){ System.err.println("WARNING: Could not load library testndk!"); } } }
2. 生成 .h 头文件
使用eclipse 编译一下工程,目的是生成相关的的 .class 文件,由于 动态连接库还未建立,即便安装到手机上也会崩溃。
不知道是否是版本的问题,我搜到的教程里面反正乱七八糟,根本就不对应个人实际状况。
在个人电脑上,eclipse将生成的class文件存放在 bin\classes (相对于工程目录,后面的操做所有基于根目录)
生成 .h 头文件的程序是 javah (不了解的能够搜索相关资料看一下)
在根目录下启动命令提示符(或者打开命令提示符切换到根目录下,取决你的右键菜单里面有没有打开命令提示符)。
输入以下命令:
javah -classpath bin\classes;D:\Android\sdk\platforms\android-20\android.jar -d jni com.example.testndk.TestNDK
其中 -classpath 里面有两个目录,一个是前面说的 bin\classes ,根据实际状况更改
第二个是 安卓的jar包,要是不加上就会报错,若是你把sdk安装在别的目录,就作出相应的更改。若是目录里面有空格,就把字符串用 "" 包围。
-d 指定生成的目录,即将生成的头文件存在在工程目录下的jni目录。
上述命令执行完毕后,jni目录下增长了一个 :com_example_testndk_TestNDK.h 文件,内容暂时不用管。
3. 编译生成 so 文件
在jni目录下建立两个文件
第一个是:testNDK.c
#include <jni.h> #include <string.h> // public native String stringTestNdk (); 方法的c签名,格式为 Java_包名_类名_方法名 JNIEXPORT jstring JNICALL Java_com_example_testndk_TestNDK_stringTestNdk(JNIEnv *env, jobject this) { return (*env)->NewStringUTF(env, "Hello,test NDK !"); }
第二个是:Android.mk
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := testNDK LOCAL_SRC_FILES := testNDK.c include $(BUILD_SHARED_LIBRARY)
保存后,退回到工程目录下打开命令提示符,执行:ndk-build
命令执行完毕后,在 libs\armeabi 目录下应该增长了一个 libtestNDK.so 文件。
4. 安装apk
从新编译运行eclipse,不出意外将会启动一个程序,显示: Hello,test NDK !
若是程序运行奔溃,而且Log处显示:WARNING: Could not load library testndk!。
说明载入 共享库失败,若是肯定代码没有变更,就用Winrar打开 bin目录下面的 apk文件,看看 lib/armeabi 里面有没有 libtestNDK.so 。 若是没有,就打开安卓工程的属性下的 java bulid path,将 libs/armeabi 加入源路径,而且从新清理运行。
三. 相关说明
1. 我在 TestNDK类中定义了两个 native 方法,生成的 头文件中有这两个方法的签名,可是我只实现第一个方法。
若是你在 程序中调用了 第二个方法就会致使 找不到 native 方法异常。
要是共享库载入成功(即没有显示 自定义的那个警告)
2. 上述仅实现了一个类中的一个方法,可是 一个 c 文件里面是能够包含多个 不一样的导出函数的,因此 使用 javah获得的方法签名 的实现代码均可以放在一个 c 文件里面。 (实际上方法签名也能够本身写,不必非得用 javah) 要是有多个c文件生成一个 so,好比 1.c 、2.c ,能够将 LOCAL_SRC_FILES 赋值为: LOCAL_SRC_FILES := 1.c 2.c 3. 关于 到底该如何编写c程序,能够参考教程《JNI彻底手册》写的比较详细。