ADT 插件: 管理 Android SDK 和相关的开发工具的
NDK 插件: 用于开发 Android NDK 的插件, ADT 版本在 20 以上, 就能安装 NDK 插件, 另外 NDK 集成了 CDT 插件 (所以本文直接针对 ADT 20 以上版本进行说明)
到 Android 官网下载最新的 NDK, 注: NDK 版本在 r7 以上之后就集成了 Cygwin, 而且还是十分精简版. 比起下载 Cygwin 要方便多啦 (Cygwin 以前需要单独安装和配置, 现在已被集成)!
下载链接见: http://developer.android.com/tools/sdk/ndk/index.html
下载完成之后, 解压搞定.
文末更多福利!
解压后的目录结构如下图所示:
打开 Eclipse, 点 Windows->Preferences->Android->NDK, 设置 NDK 路径, 例如我的是: D:\Android\Android-ndk_r10-Windows
新建一个 Android 工程, 在工程上右键点击 Android Tools->Add Native Support... , 然后给我们的. so 文件取个名字, 例如我的是: XS_NDK_01
这时候工程就会多一个 jni 的文件夹, jni 下有 Android.mk 和 XS_NDK_01.cpp 文件. Android.mk 是 NDK 工程的 Makefile,XS_NDK_01.cpp 就是 NDK 的源文件.
(关于 Android.mk 的说明可以参考资料: http://www.cnblogs.com/luxiaofeng54/archive/2011/08/13/2137577.html)
JNI 接口的命名规范是: Java_ + 调用该方法的包名 (包名的点用 * 代替) + *+ 调用该接口的类名 + _ + 方法名, 对于实例方法, 有两个参数是必要的, 一个 JNI 的环境指针 JNIEnv *, 另一个是调用该方法的 Java 实例 jobject
接下来编辑 XS_NDK_01.cpp 文件, 写一个 HelloWorld 的 demo, 代码如下:
- #include <string.h>
- #include <jni.h>
- extern "C"{
- jstring
- Java_com_shanhy_example_ndk01_MainActivity_getStringFromJNI(JNIEnv* env, jobject thiz)
- {
- // 返回一个字符串给 Java 层
- return env->NewStringUTF("小单 的 JNI HellWorld 程序.");
- }
- }
完成了, 然后运行. 运行之前先编译 NDK, 然后在编译 JAVA 代码. 编译也许会遇到 Unable to launch cygpath. Is Cygwin on the path? 如何解决?
Eclipse -> Windows -> Preperences -> C/C++ -> Build -> Environment 添加一个环境变量 NDKROOT, 如下图:
再工程右键, 点 Properties->C/C++ Build 的 Building Settings 中去掉 Use default build command, 然后输入 ${NDKROOT}/ndk-build.cmd, 如下图:
然后创建一个 Activity 调用我们刚刚编写的 HelloWorld, 代码如下:
- package com.shanhy.example.ndk01;
- import Android.App.Activity;
- import Android.content.Context;
- import Android.os.Bundle;
- import Android.view.View;
- import Android.view.View.OnClickListener;
- import Android.widget.Button;
- /**
- * HelloWorld NDK 开发
- *
- * @author SHANHY(365384722@QQ.COM)
- * @date 2015 年 11 月 19 日
- */
- public class MainActivity extends Activity {
- // 也就是你 mk 配置文件中的 LOCAL_MODULE := XS_NDK_01
- private static final String libSoName = "XS_NDK_01";
- private Context mContext = null;
- private Button btnClick = null;
- private String mStrMSG = null;
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- mContext = this;
- btnClick = (Button) findViewById(R.id.btn_click);
- btnClick.setOnClickListener(new OnClickListener() {
- public void onClick(View v) {
- // 调用 JNI 层实现的方法
- mStrMSG = getStringFromJNI();
- if(mStrMSG == null) {
- mStrMSG = "调用 JNI 失败";
- }
- LogUtils.toastMessage(mContext, mStrMSG);
- }
- });
- }
- /**
- * 声明本地方法
- *
- * 该方法为 native 方法. 由 C 实现
- *
- * @return JNI 给出的信息
- */
- public native String getStringFromJNI();
- /**
- * 载入 JNI 生成的 so 库文件
- */
- static {
- System.loadLibrary(libSoName);
- }
- }
NDK 只是我们 Android 进阶学习中的小模块, 下面链接有详细大纲, 有需要学习的朋友可以私信我哦!
点击查看完整高清的 Android 高级课程大纲脑图查漏补缺腾讯 T3Android 高级技术脑图
来源: http://www.jianshu.com/p/fa38e0225928