Android NDK 构建开发环境并运行第一个NDK示例

最近开始研究Android开发,由于Android SDK基本不熟悉,Java一知半解,1年前大概玩了一下,写了一个扫雷,一个连连看,对Android SDK的API不熟悉,最终放弃了继续学习。因此这次研究选择NDK开发是我的首选,不过作为Android新人,建立开发环境以及运行第一个例程实在是费了我很多时间和脑细胞呀。看了很多过时的教程,最后好不容易跑起来了。下面开始介绍如何搭建开发环境。

     第一步,安装配置JDK,这一步问题不大,网上一大把的教程。作为多年的C++开发者,我对于JDK手动配置环境变量实在有些不解,这对新人来说提高了门槛,熟手则嫌麻烦。10年前JDK都需要手动配置,现在还是需要手动,安装程序顺便把这几个环境变量写进系统不好吗?对于Android也一样,安装SDK都费老大的劲,版本多如麻,网上的教程也很多,大部分还不顶用。一家之见。不扯远了,我们继续。

     第二步,安装Android SDK和Eclipse,我第一次学安卓的时候,大概是安卓2.2的时候,那时候安卓SDK简直是灾难,手把手看教程,下载SDK安装包,网上更新慢如蜗牛,然后安装Eclipse,配置SDK等等,菜鸟要搞定这些,起码半天时间。好了不吐槽了,现在安装要好多了,Google还是比较给力了,不但省掉了安装过程以及网上更新,更是将Eclipse集成到一起了,赞一个!直接到官网下载adt包,然后解压完就能用了,我下载的版本是adt-bundle-windows-x86-20130729.zip,大家可以根据自己需要来下载相应的版本。

    第三步,安装配置Android NDK,这一步经过google的整合,到目前已经很简单了,直接下载解压就可以了,我下载的版本是android-ndk-r9-windows-x86.zip。从NDK r7开始,Windows平台已经去掉了Cygwin的依赖,这对开发者搭建开发环境省了很多时间和精力。解压好之后打开Eclipse,选择菜单Window->Perferences->Android->NDK,把NDK的路径填好即可,如下图。到这里NDK的开发环境就搭建好了。

    接下来,我在分享一下如何跑第一个NDK程序。

    第一步,建立一个新的Android工程。

    第二步,添加JNI支持,网上很多教程上都是比较繁琐的旧方案,需要手动的做很多事情,比如写mk文件等,现在NDK r9做这一步很简单,只需要在项目上点击右键,选择Android Tools->Add Native Support即可,然后Eclipse会自动为我们创建一个jni的工作目录,里面有一个cpp文件和一个mk文件,如下图。

     第三步,为这个工程创建c++编译选项。在项目名称上右键点击Properties->Builders->New->Program,进入创建页面,为编译器命名,Location选择NDK目录下的ndk-build.cmd,就是这个文件代替的Cygwin。然后选择工程目录。如下图所示:

     然后在Build Options页面勾选specify...,并点击右边的按钮并选择目录然后点OK,如下图:

     第四步,编写代码,cpp文件里面编写如下代码,注意命名规则, com_example_firstndk是java包名,FirstNDK是java类名,这里我目前还没找到java是如何找到C++的函数的规则。只有这样才能运行。    

#include <string.h>
#include <jni.h>
 
extern "C"
{
	jstring Java_com_example_firstndk_FirstNDK_stringFromJNI(JNIEnv* env, jobject thiz)
	{
		return env->NewStringUTF("Hello from JNI!");
	}
}

 

    然后编写Android 代码,如下:

package com.example.firstndk;
 
import android.widget.TextView;
import android.os.Bundle;
import android.app.Activity;
 
public class FirstNDK extends Activity {
 
	@Override
	public void onCreate(Bundle savedInstanceState)
      {
        super.onCreate(savedInstanceState);
        TextView  tv = new TextView(this);
        tv.setText( stringFromJNI() );
        setContentView(tv);
      }
	public native String  stringFromJNI();
	public native String  unimplementedStringFromJNI();
	
	static {
	        System.loadLibrary("FirstNDK");
	}
}

  
 

     注意C++代码里面要加extern "C",否则会运行时找不到函数。

     这个时候C++代码还是会报错,这是因为还没有将JNI的头文件和库的目录加到Eclipse。

     可以手动加上去,项目右键点击选择Properties->C/C++ General->Path and Symbols,加入NDK的路径F:\技术预研\android\android-ndk-r9\platforms\android-18\arch-arm\usr\include,再编译就可以了。我今天写博客的时候,发现不用手动也行,写完代码后,直接Build Project,Eclipse自动把相关的目录加上了。

     到这里,我们就大功告成啦,运行吧,少年!如果大家按以上没有成功,请联系我吧,哈哈!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Janti

记一次内存溢出的分析经历——thrift带给我的痛orz

说在前面的话 朋友,你经历过部署好的服务突然内存溢出吗? 你经历过没有看过Java虚拟机,来解决内存溢出的痛苦吗? 你经历过一个BUG,百思不得其解,头发一根一...

55580
来自专栏腾讯Bugly的专栏

dex分包变形记

一、背景 就在项目灰度测试前不久,爆出了在 Android 3.0以下手机上安装时出现 INSTALL _ FAILED_DEXOPT,导致安装失败。这一问题意...

487110
来自专栏拭心的安卓进阶之路

Android 性能优化:多线程

前言 Android Performance Patterns Season 5 主要介绍了 Android 多线程环境下的性能问题。通过介绍 Android ...

26490
来自专栏大数据和云计算技术

HBase运维实践-聊聊RIT的那点事

相信长时间运维HBase集群的童鞋肯定都会对RIT(Region-In-Transition,很多参考资料误解为Region-In-Transaction,需要...

29540
来自专栏大数据和云计算技术

HBase框架基础(二)

HBase的基础框架,将分成几个章节对HBase进行描述,不当之处还望大家批评指正。下面是了解HBase基础架构的第二部分。

15720
来自专栏java初学

scrapy(2)——scrapy爬取新浪微博(单机版)

1.1K150
来自专栏张善友的专栏

.NET代码快速转换成powershell代码

从PowerShell 2的第一个技术预览版到现在,已经过去将近两年的时间了,下面列出了在这期间添加的一些新特性。 Remoting:可以在远程机器上运行Cmd...

22270
来自专栏Crossin的编程教室

[Hexo]部署博客及更新博文

本系列其它文章: 用 GitHub + Hexo 建立你的第一个博客 将本地文件部署到 GitHub 修改 Hexo 中的 _config.yml 文件 在...

36490
来自专栏玄魂工作室

Kali Linux Web渗透测试手册(第二版) - 2.3 - 使用Nmap进行扫描和识别应用服务

thr0cyte,Gr33k,花花,MrTools,R1ght0us,7089bAt,

27130
来自专栏Pythonista

saltstack高效运维

saltstack是由thomas Hatch于2011年创建的一个开源项目,设计初衷是为了实现一个快速的远程执行系统。

28250

扫码关注云+社区

领取腾讯云代金券