曾经做Android的项目要用到NDK就必需要下载NDK,下载安装Cygwin(模拟Linux环境用的),下载CDT(Eclipse C/C++开发插件),还要配置编译器,环境变量...

麻烦到不想说了,Shamoo在网上查了一下资料,发现了一个超级快配置NDK的办法。

Step1:到Android官网下载Android的开发工具ADT(Android Development Tool的缩写),该工具集成了最新的ADT和NDK插件以及Eclipse,另一个最新版本号SDK。解压之后就能够用了,很爽!

ADT插件:管理Android SDK和相关的开发工具的

NDK插件:用于开发Android NDK的插件。ADT版本号在20以上。就能安装NDK插件,另外NDK集成了CDT插件

也能够在线更新ADT、NDK插件。只是速度超级慢...所以果断在网上下载集成开发工具ADT。下载链接见:http://developer.android.com/sdk/index.html

Step2:到Android官网下载最新的NDK,注:NDK版本号在r7以上之后就集成了Cygwin,并且还是十分精简版。比起下载Cygwin要方便多啦。下载链接见:http://developer.android.com/tools/sdk/ndk/index.html

下载完毕之后。解压搞定!

Step3:打开Eclipse,点Window->Preferences->Android->NDK,设置NDK路径。比如Shamoo的是E:\android-ndk-r9c

Step4:新建一个Androidproject,在project上右键点击Android Tools->Add Native Support...,然后给我们的.so文件取个名字,比如:my-ndk

这时候project就会多一个jni的目录。jni下有Android.mk和my-ndk.cpp文件。Android.mk是NDKproject的Makefile。my-ndk.cpp就是NDK的源文件。

Step5:接下来仿着NDK的demo,Hello-JNIproject写一下。使用Alt + '/'能够代码提示!非常爽!有木有?之前用CDT时候死活都按不出代码提示。郁闷...

JNI接口的命名规范是:Java_ + 调用该方法的包名(包名的点用_取代) + _ + 调用该接口的类名 + _ + 方法名。对于实例方法。有两个參数是必要的。一个JNI的环境指针JNIEnv *。还有一个是调用该方法的Java实例jobject

my-ndk.cpp:

?
1
2
3
4
5
6
#include
<jni.h>
 
JNIEXPORT
jstring JNICALL Java_com_shamoo_activity_TestActivity_stringFromJNI(JNIEnv *env,
        jobject
thiz) {
    returnenv->NewStringUTF("Hello
jni"
);
}</jni.h>

TestActivity.java:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
publicclassTestActivity
extendsActivity
{
 
    static{
        System.loadLibrary("my-ndk");
    }
     
    //
声明JNI层的原生方法,使用nativekeyword
    publicnativeString
stringFromJNI();
     
    @Override
    protectedvoidonCreate(Bundle
savedInstanceState) {
        super.onCreate(savedInstanceState);
        TextView
tvText =
newTextView(this);
        tvText.setText(stringFromJNI());
        setContentView(tvText);
    }
 
}

使用ndk库必须在static代码块里面用System.loadLaibrary载入.so库

Step6:完毕了,然后执行。

执行之前先编译NDK,然后在编译JAVA代码。编译或许会遇到Unable to launch cygpath. Is Cygwin on the path?错误,解决的方法例如以下:

1.project右键。点Properties->C/C++ Build的Building Settings中去掉Use default build command。然后输入${NDKROOT}/ndk-build.cmd

2.在C/C++ Build中点击Environment,点Add...加入环境变量NDKROOT,值为NDK的根文件夹

3.再编译。问题就解决啦!

执行时崩溃,遇到java.lang.UnsatisfiedLinkError: stringFromJNI错误,解决的方法:在C++文件里函数定义前加入extern "C"修饰

?
1
2
3
4
5
6
7
8
9
extern"C"{
JNIEXPORT
jstring JNICALL Java_com_shamoo_activity_TestActivity_stringFromJNI(JNIEnv *env,
        jobject
thiz);
}
 
JNIEXPORT
jstring JNICALL Java_com_shamoo_activity_TestActivity_stringFromJNI(JNIEnv *env,
        jobject
thiz) {
    returnenv->NewStringUTF("Hello
jni"
);
}

原因是:使用extern "C"修饰,编译器会按C语言的方式编译和连接。在C语言中。函数编译之后函数名与C++函数编译之后不同,比如foo(int x, int y),C可能会编译成_foo的名字,而C++由于支持重载。所以会编译成像_foo_int_int这样的带參数的函数名。假设是依照C语言的编译方式,调用foo函数是找不到_foo的函数名就会报出函数名找不到的错误。所以要加入extern
"C"修饰。

扩展:http://blog.csdn.net/houshunwei/article/details/17217695

Type 'JNIEnv' could not be resolved
等信息解决的方法
        http://www.cnblogs.com/hlppsite/p/3349377.html

新版本NDK环境结构(避Cygwin,超快)的更多相关文章

  1. Android 新版NDK环境搭建(免Cygwin)

    使用最新ndk,直接抛弃cygwin,以前做Android的项目要用到NDK就必须要下载NDK,下载安装Cygwin(模拟Linux环境用的),下载CDT(Eclipse C/C++开发插件),还要配 ...

  2. windows 下配置ndk环境,无需cygwin

    时隔好久要用ndk编译jni库,本以为配制安装cygwin环境,便按部就班的下载安装,但是公司的网速真的不给力,三天安装了三四次都没有安装成功(我选择的是在线安装),于是我便开始查ndk的官网看看,发 ...

  3. Cocos2d-x 3.0final 终结者系列教程15-win7+vs2012+adt+ndk环境搭建(无Cygwin)

    最终不用Cygwin 了.非常高兴 为什么要用Win7? 由于VS2012要求Win7以上系统才干安装! 为什么要用vs2012? 由于VS2012才支持C++11! 为什么要支持C++11? 由于C ...

  4. NDK环境搭建(Native Code的编译,不需要Cygwin)

    分类: android2013-06-21 15:49 475人阅读 评论(0) 收藏 举报 Android NDK 目录(?)[-] System and Software Requirements ...

  5. windows 环境内网超快同步 DFS

    记录下: 在WINDOWS环境下,内网同步使用DFS可以超快实现文件同步,效果非常OK 纯粹记录下!

  6. Windows XP环境下 搭建Android NDK环境

    搭建Android NDK环境 Windows XP环境下 1 一些下载 ① NDK r7:http://developer.android.com/sdk/ndk/index.html ② cygw ...

  7. android ndk环境配置(转)

    转载自:http://jingyan.baidu.com/article/3ea51489e7a9bd52e61bbac7.html android sdk 更新到 r23 时,eclipse 自带 ...

  8. android NDk环境编译总结

    首先,这篇文章的撰写是基于很多前人的优秀的帖子,感谢他们的分享让我能够学习这么多的知识.谢谢 Android NDK开发环境的搭建 前言: Android 上,应用程序的开发,大部分基于 Java 语 ...

  9. 【转】Windows环境下Android NDK环境搭建

    原文网址:http://www.metsky.com/archives/525.html 前面介绍Windows下Android 开发环境配置,主要是面向JAVA开发环境,对只做APK上层应用开发人员 ...

随机推荐

  1. 用KnockoutJS实现ToDoMVC代码分析

    体验地址 Knockout 版todo web app在线体验 http://todomvc.com/examples/knockoutjs/ 源码地址 项目源码地址,此地址包含了各种JS框架实现的t ...

  2. Windows phone 8 学习笔记(5) 图块与通知

    原文:Windows phone 8 学习笔记(5) 图块与通知 基于metro风格的Windows phone 8 应用提到了图块的概念,它就是指启动菜单中的快速启动图标.一般一个应用必须有一个默认 ...

  3. Windows Phone开发(32):路径之PathGeometry

    原文:Windows Phone开发(32):路径之PathGeometry 说起路径这玩意儿,其实说的就是Path类,它藏在命名空间System.Windows.Shapes下,应该好找,它有一个很 ...

  4. C++第11周(春)项目1 - 存储班长信息的学生类

    课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 [项目1 - 存储班长信息的学生类] clas ...

  5. Netty In Action中国版 - 第二章:第一Netty程序

    本章介绍 获得Netty4最新的版本号 设置执行环境,以构建和执行netty程序 创建一个基于Netty的server和client 拦截和处理异常 编制和执行Nettyserver和client 本 ...

  6. JDK源码学习系列05----LinkedList

                                             JDK源码学习系列05----LinkedList 1.LinkedList简介 LinkedList是基于双向链表实 ...

  7. C# Windows Phone 8 WP8 开发,将WebClient的DownloadStringCompleted事件改成非同步的awiat方法。

    原文:C# Windows Phone 8 WP8 开发,将WebClient的DownloadStringCompleted事件改成非同步的awiat方法. 一般我们在撰写Windows Phone ...

  8. HDU 4951 Multiplication table 阅读题

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=4951 题意:给一个P进制的乘法表.行和列分别代表0~p-1,第i行第j*2+1和第j*2+2列代表的是第i ...

  9. lua-TestMore(转)

    http://fperrad.github.io/lua-TestMore/ http://www.softpedia.com/get/Programming/Debuggers-Decompiler ...

  10. CAS实现SSO单点登录原理(转)

    1.      CAS 简介 1.1.  What is CAS ? CAS ( Central Authentication Service ) 是 Yale 大学发起的一个企业级的.开源的项目,旨 ...