Android NDK开发(一)环境搭建及运行示例

/***************************************************

 * TODO: description .

 * @author: gao_chun

 * @since:  2015-3-30

 * @version: 1.0.0

 *
@remark: 转载请注明出处

 **************************************************/

下载Android开发工具,这里使用Eclipse,若无法下载,可查看

Android官网无法下载eclipse-adt-bundlehttp://blog.csdn.net/gao_chun/article/details/41010629

下载后若Android SDK无法正常更新,可查看

Android
SDK无法更新终极解决方式
http://blog.csdn.net/gao_chun/article/details/37971461

在android ndk r7之后,已经不用下载安装Cygwin(模拟Linux环境),在以往的NDK开发中必须要下载,且需下载CDT(Eclipse
C/C++开发插件),还要配置编译器,环境变量,等等。太过于麻烦。

一、介绍下NDK是什么东西

1.NDK是一系列工具的集合

NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。这些工具对开发者的帮助是巨大的。NDK集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。NDK可以自动地将so和Java应用一起打包,极大地减轻了开发人员的打包工作。

2.NDK提供了一份稳定、功能有限的API头文件声明

Google明确声明该API是稳定的,在后续所有版本中都稳定支持当前发布的API。从该版本的NDK中看出,这些API支持的功能非常有限,包含有:C标准库(libc)、标准数学库(libm)、压缩库(libz)、Log库(liblog)。

二、为什么使用NDK

  1.代码的保护。由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大。

  2.可以方便地使用现存的开源库。大部分现存的开源库都是用C/C++代码编写的。

  3.提高程序的执行效率。将要求高性能的应用逻辑使用C开发,从而提高应用程序的执行效率。

  4.便于移植。用C/C++写得库可以方便在其他的嵌入式平台上再次使用。

三、下载NDK之后,解压便可

注:1.在android-ndk-r10c目录下有一个samples的目录,里面存放着例子,可供学习。

2.注意NDK的环境变量,如:

四、在Eclipse的Window->Preferences->Android->NDK,设置NDK路径,例如:

注:需检查ADT插件是否安装了Android Native Delelopment Tools(可在Eclipse - Help - Install new Software中检查)

五、新建一个Android工程后,在new出来的Project上右键点击Android Tools->Add Native Support...给库文件(.so)取个名字,如:hello

这时你会发现工程会多一个jni的文件夹,jni下有Android.mk和hello.cpp文件。

Android.mk是NDK工程的Makefile,hello.cpp就是NDK的源文件。

有关Android.mk文件的介绍:http://blog.csdn.net/gao_chun/article/details/44656169

六、我们在hello.cpp中写下如下代码,可以参考samples目录中的hello-jni例子。

#include <jni.h>
extern "C" {
JNIEXPORT jstring JNICALL Java_com_hello_Main_stringFromJNI(JNIEnv *env,
        jobject thiz) {
    return env->NewStringUTF("Hello jni");
}
}

C代码中是:

return (*env)->NewStringUTF(env,"Hello jni!");

C++代码是:

return env->NewStringUTF("Hello jni!");

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

这里需要注意一点,按照如下的方式写,在程序运行后是报错的(注:是程序运行后会报错,不是该文件有错,该文件有错是因为java编辑器没有安装支持C/C++的插件所导致,在该文件编写完成后可以colse项目从新打开便可,或者clean):

报错信息如下:

总结:使用extern "C"修饰,编译器会按C语言的方式编译和连接。在C语言中,函数编译之后函数名与C++函数编译之后不同,例如foo(int x, int y),C可能会编译成 _foo 的名字,而C++因为支持重载,所以会编译成像 _foo_int_int 这种带参数的函数名。如果是按照C语言的编译方式,调用foo函数是找不到_foo的函数名就会报出函数名找不到的错误。所以要添加extern
" C "修饰。

七、Main.java :

package com.hello;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class Main extends Activity {
    //静态方法优先加载
    static {
        System.loadLibrary("hello");
    }

    //声明jni层的原生方法,使用native关键字
    public native String stringFromJNI();

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        TextView  tv = new TextView(this);
        tv.setText(stringFromJNI());
        setContentView(tv);
    }
}

注:static代码块里面用System.loadLaibrary加载的是编译器编译完成后的.so库,并非hello.cpp文件。

八、完成,运行就ok。

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

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

2.在C/C++ Build中点击Environment,点Add...添加环境变量NDKROOT,值为NDK的根目录

3.再编译就ok!

如果觉得文章对你有用,点个赞将是我最大的动力!

时间: 2024-11-06 07:32:11

Android NDK开发(一)环境搭建及运行示例的相关文章

Android NDK开发(一)——环境搭建

转载请注明出处:http://blog.csdn.net/allen315410/article/details/41800955 Android下的NDK开发是Android开发中不可或缺的一部分,通过Google提供的NDK套件,我们可以使用JNI这座桥梁在Java和C/C++之间建立联系(互相调用).那么,为什么在Android开发中需要了解NDK开发呢?诚然,这些原因有很多说法,在我总结来是这样的.C/C++是比Java还要古老的编程语言,由于其古老的特性,导致早期有很多优秀的类库出现,

windows下用ADT进行android NDK开发的详细教程(从环境搭建、配置到编译全过程)

郑重申明:如需转载本博客,请注明出处,谢谢! 这几天在学习android NDK的开发,那么首先让我们来看看android NDK开发的本质是什么. NDK(Native Development Kit),即本地开发工具,简单地说,就是在开发android应用程序的时候,在java类中调用native函数,而native函数的接口也是在java类中定义的,但是native函数最终由本地的C/C++代码实现.简单地说,就是在java中调用C/C++函数.至于为什么要用NDK,我总结了一下,大致有以

C++开发安卓、windows下搭建Android NDK开发环境

1. NDK(Native Development Kit) 1.1 NDK简介 Android NDK是一套允许开发人员使用本地代码(如C/C++)进行Android APP功能开发的工具,通过这个工具,我们可以把用C/C++代码编译成可以直接运行在Android平台上的本地代码,这些本地代码以动态链接库( *.so )的形式存在,也正因为这样,我们可以通过复用这些动态链接库从而复用本地代码. 那么,通过NDK这个开发工具包,那么我们是否可以将一个APK完全使用C/C++来编写呢? 答案是不可

Android NDK开发环境搭建

目录[-] 一.下载NDK开发包,并解压. 二.下载Cygwin,安装所需库. 三.将NDK添加到Cygwin的build配置中. 四.安装CDT. ? 1 2 3 4 5 /* http://my.oschina.net/lifj/blog/176916 */ 有人说,网上的环境配置一大堆,你还写做什么?一来,是我再次复习的材料.二来,网上有些地方说的不是很详细,我也是参考了好多资料,弄了半天才弄好环境.写下来,帮助后面的人省掉不必要的麻烦.下面进入正题. 作为一个2年的android攻城狮,

android,android NDK开发环境搭建(仅供参考)

/*****************************************************************************工作需要,重新配置了 android+NDK 开发环境,记录一下. 系统环境:Windows 7 64位 创建时间:2014-10-17 个人随笔,保留所有权.转载请注明出处和作者erwin ****************************************************************************

Android NDK:①开发环境的搭建(Windows下Eclipse无cygwin)

Android NDK:①开发环境的搭建(Windows下Eclipse无cygwin)                                   --转载请注明出处:coder-pig 一些概念性的东西: JNI:(Java Native Interface Java)本地开发的接口,通过他,Java调用外部的c/c++代码, 外部的c/c++代码可以调用Java代码! NDK:(Native Develop Kits)本地开发套件Google提供给我们的一个在Android上开发J

搭建android底层开发的环境读后感

本章主要介绍如何搭建android底层开发的环境,主要包括android应用程序开发环境.android NDK开发环境个交叉编译环境的搭建. 首先开发.测试和调试linux驱动.HAL程序库需要以下工具: 1.JDK6或以上版本: 2.Eclipse3.4或以上版本: 3.ADT: 4.CDT: 5.Android SDK: 6.Android NDK: 7.交叉编译环境: 8.Linux内核源代码: 9.Android源代码: 10.用于调试开发板的串口工具:minicom. 关于JDK的安

android如何使用自定义JNI接口,以及NDK工具的环境搭建与使用。

一.环境的搭建: 1.需要的工具: A.cygwin    (在windows下使用LINUX系统)                                                                    http://www.cygwin.com B.android-ndk-1.6_r1-windows (主要是起到将C或C++编译成动态库的作用)   http://dl.google.com/android/ndk/android-ndk-1.6_r1-wind

.Net程序员玩转Android开发---(1)环境搭建

对于没有接触过Android开发的人员来说,可能感觉Android开发比较困难,接下来的一段时间,我们将了解Android开发的具体细节,主要是面对.NET程序员,来看看.NET程序员怎样进行Android开发.  下面我们切入本节正题. 工欲善其事,必先利其器,下面我们准备Android开发的环境搭建,下面是开发的一些工具 1. JDK安装   jdk下载 http://www.oracle.com/technetwork/java/javase/downloads/index.html JD