`

Android新版NDK环境配置(免Cygwin)

 
阅读更多

转自:http://blog.csdn.net/codezjx/article/details/8879670

前言:Android NDK r7及以上的版本已经集成了Cygwin编译环境,也就是说,我们完全可以抛弃庞大的Cygwin了。

 

r6及以下版本,也可以抛弃几个G的完整版,使用精简过的Mini-Cygwin来编译,解压后大小仅9M,但短小巧精悍,完全可以满足Android NDK的开发。

下载地址:https://code.google.com/p/mini-cygwin/

Eclipse集成Cygwin编译环境可以参考我的这篇贴:http://blog.csdn.net/codezjx/article/details/8858825

 

 

下面进入正题,r7及以上版本,跟着我的这篇帖子,完成环境的升级吧!!!

参考官网:http://tools.android.com/recent/usingthendkplugin

1、首先确认自己的ADT版本,NDK plugin的支持是在ADT 20及以后的版本。

2、安装Android Native Development Tools(该组件集成C/C++开发环境),既在安装ADT工具的时候勾选NDK组件,一路next后重启Eclipse使插件生效。

3、下载NDK工具http://developer.android.com/tools/sdk/ndk/index.html,我使用的是最新的android-ndk-r8e-windows-x86.zip,下载完后解压缩。

4、Eclipse -> Window -> Preferences -> Android -> NDK,设置NDK为刚刚解压缩的工具包路径。

5、NDK环境基本上已经搭建好,新建一个普通Android项目测试NDK支持。项目右键->Android Tools->Add Native Support...,输入.so库名字后点击Finish

(注意:若项目已经是一个Jni项目,例如NDK example里面的HelloJni,这一步中.so库名字不用填)

6、现在已经可以Build我们的Jni项目了,选择项目,Project->Build Project,编译我们的c/c++代码,此时项目结构如下,NDK plugin已经为我们添加好了include,已经为我们生成了相应的Android.mk以及 cpp文件。(注意:这里插件为我们生成的是cpp文件,若你不喜欢可以改回.c,并在mk文件中进行相应更改)

7、这时,Android NDK环境已经完美搭建好,我们可以在cpp文件中流畅地书写我们的c/c++代码。

(而且当你Alt+/时,已经可以使用自动提示,各种爽歪歪有木有。若你不是用NDK plugin来构建JNI项目,而是选择手动方式,Alt+/是不会提示的

8、关于编译,默认情况下:选择项目,Project->Build Project,来重新编译我们的代码。而且每次run项目的时候,也会自动编译.so库。

 

 

一些问题与解决方法:

问题一:Android NDK: WARNING: APP_PLATFORM android-14 is larger than android:minSdkVersion 8 in ./AndroidManifest.xml    (这个是NDK工具的一个BUG,若build Target大于minSdkVersion,则会报这个错误,导致无法运行)
解决方法:
android-ndk-r8e/build/core/add-application.mk第128行把__ndk_warning改为__ndk_info;然后重新build一次项目即可消除错误。
原文:
this problem may be safely fixed by changing this line in add-application.mk from __ndk_warning to __ndk_info
链接:

https://code.google.com/p/android/issues/detail?id=39752



问题二:使用c++来编写本地库,会有一些兼容问题。

(1)直接黏贴HelloJni的stringFromJNI函数过来测试,提示Method 'NewStringUTF' could not be resolved
解决方法

改为:将(*env)->NewStringUTF(env, "Hello from JNI !")改为return env->NewStringUTF("Hello from JNI !")即可

原因是:

NDK plugin默认为我们生成的是cpp文件,而C与C++调用函数的参数不一致,因此找不到函数,具体参考jni.h中的定义。cpp文件中形如(*env)->Method(env, XXX)改成env->Method(XXX)即可。

 

 

(2)运行c++生成的.so库,若报以下错误:(既找不到函数)

No implementation found for native Lcom/dgut/android/MainActivity;.stringFromJNI ()Ljava/lang/String;

java.lang.UnsatisfiedLinkError: stringFromJNI

at com.dgut.android.MainActivity.stringFromJNI(Native Method)

解决方法:

为供Java调用的c++函数前加入extern "C" 修饰,如:(NDK example里面的cpp文件也是这么声明的,参考hello-gl2)

 

[java] view plaincopy
 
  1. extern "C" {  
  2.     JNIEXPORT jstring JNICALL Java_com_dgut_android_MainActivity_stringFromJNI( JNIEnv* env, jobject thiz );  
  3. }  
  4.   
  5. JNIEXPORT jstring JNICALL Java_com_dgut_android_MainActivity_stringFromJNI( JNIEnv* env, jobject thiz )  
  6. {  
  7.     return env->NewStringUTF("Hello from JNI bear c++");  
  8. }  

原因是:

 

        被extern "C"修饰的变量和函数是按照C语言方式编译和连接的。

        首先看看C++中对类似C的函数是怎样编译的:作为一种面向对象的语言,C++支持函数重载,而过程式语言C则不支持。函数被C++编译后在符号库中的名字与C语言的不同。例如,假设某个函数的原型为:void foo( int x, int y );该函数被C编译器编译后在符号库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字(不同的编译器可能生成的名字不同,但是都采用了相同的机制,生成的新名字称为“mangled name”)。_foo_int_int这样的名字包含了函数名、函数参数数量及类型信息,C++就是靠这种机制来实现函数重载的。例如,在C++中,函数voidfoo( int x, int y )与void foo( int x, float y )编译生成的符号是不相同的,后者为_foo_int_float。
        同样地,C++中的变量除支持局部变量外,还支持类成员变量和全局变量。用户所编写程序的类成员变量可能与全局变量同名,我们以"."来区分。而本质上,编译器在进行编译时,与函数的处理相似,也为类中的变量取了一个独一无二的名字,这个名字与用户程序中同名的全局变量名字不同。

        因此,若我们没有使用extern "C"修饰函数,按照C语言方式编译和连接,Jni调用将可能找不到该函数。

分享到:
评论

相关推荐

    Android NDK环境配置

    Android NDK环境配置是Android应用开发中的一个重要环节,它允许开发者使用C或C++编写高性能的原生代码,这些代码可以被编译成动态库并与Java应用一同打包成APK。NDK集成了交叉编译器,使得开发者能够针对不同的CPU...

    NDK环境变量配置cygwin1.7

    3. **配置Cygwin终端**: - 在Cygwin中,`/bin`目录下的可执行文件需要被添加到PATH,因为它们包含了诸如`bash`, `ls`, `cd`等命令。 - 配置`~/.bash_profile`或`~/.bashrc`文件,根据个人需求添加自定义的路径或...

    android ndk 开发环境配置,不需要cygwin,可直接生成.h文件,直接编译库

    ### Android NDK 开发环境配置详解 #### 一、引言 随着移动互联网技术的不断发展,Android平台的应用程序越来越受到开发者的青睐。而在Android应用程序开发过程中,为了提高应用性能或实现某些特定功能(如图像...

    非常强大的eclipse中android ndk开发环境的配置说明

    ### 非常强大的Eclipse中Android NDK开发环境的配置说明 #### 一、概述 本文档将详细介绍如何在Eclipse中配置Android NDK开发环境,并实现C/C++代码的自动编译以及通过Eclipse使用Ant生成JNI所需的头文件。配置流程...

    Android_NDK环境搭建

    ### Android NDK环境搭建知识点详解 #### 一、概述 Android NDK (Native Development Kit) 是一套用于在Android上开发原生应用或者扩展应用性能的工具集。它提供了执行原生代码(C/C++)的能力,并提供了将这些代码与...

    Android NDK Cygwin配置

    #### 三、配置NDK环境变量 在完成Cygwin的安装后,还需要进一步配置NDK的工作环境,这通常涉及到设置环境变量。 1. **找到NDK安装目录**:假设您已经下载并解压了Android NDK至某文件夹(例如`C:\Android\ndk-...

    windows下eclipse集成cygwin编译android_NDK

    2. **配置 NDK 路径**:确保已经安装了 Android NDK,并将其添加到系统的 PATH 环境变量中。例如,如果你的 NDK 安装在 `F:\android\NDK\android-ndk-r4` 目录下,那么需要将该路径添加到 PATH 变量中。 3. **安装 ...

    windows下androidNDK环境配置

    Windows下Android NDK环境配置 一、什么是NDK? NDK(Native Development Kit)是一款提供了一系列工具帮助开发者快速开发C(或C++)动态库,并能自动将.so和Java应用一起打包成apk的开发工具。这些工具对开发者的...

    Android-NDK环境配置以及开发规范.docx

    ### Android-NDK环境配置与开发规范详解 #### 一、引言 随着移动应用的不断发展,Android 平台的应用程序开发变得越来越重要。而为了提高应用性能或复用现有 C/C++ 代码,Android NDK (Native Development Kit) ...

    android NDK 安装必备 Cygwin

    安装完成后,你需要配置Cygwin的路径到系统的PATH环境变量中,以便在命令行中直接调用Cygwin的工具。然后,你可以下载并解压Android NDK,将其放在Cygwin能够访问的位置。 在Cygwin环境下,你可以使用NDK提供的`ndk...

    android的NDK开发中Cygwin的环境变量的配置

    一个使用cygwin做ndk的文档,可供初学者参考参考。。

    windows下android NDK环境的搭建

    Windows环境下搭建Android NDK环境是为了在Android应用开发中使用C和C++代码,生成.so动态库。这个过程涉及到多个步骤,包括安装和配置SDK、NDK、Eclipse、Cygwin等工具。 1. **SDK、NDK、Eclipse的安装** - ...

    eclipse android ndk环境配置及项目编译超详细攻略

    ### Eclipse Android NDK环境配置及项目编译详细指南 #### 一、概述 本文档将详细介绍如何在Eclipse环境中配置Android NDK环境以及如何编译包含NDK组件的项目。NDK (Native Development Kit) 是Android平台提供的...

    android-ndk-r20b-windows-x86_64.zip

    在使用NDK和FFmpeg进行视频编辑动态库编译时,首先需要配置NDK环境,包括设置路径、编译选项等。接着,通过NDK的交叉编译功能,将FFmpeg源代码编译为适用于Android平台的目标代码。这一步通常涉及到修改FFmpeg的配置...

    Eclipse下配置NDK不用安装Cygwin

    【Eclipse下配置NDK不用安装Cygwin】的知识点主要集中在如何在Windows环境下使用NDK进行Android原生代码开发,以及如何在Eclipse中设置Builder以实现自动编译NDK项目,避免依赖Cygwin。 1. **NDK介绍**: - NDK...

    ndk-r8 编译环境(不需要cygwin等)

    本文主要讲解如何在不依赖Cygwin等额外环境的情况下,配置NDK-R8的编译环境,并详细介绍JNI程序的编写步骤。 首先,确保你已经下载了Android NDK的R8版本。在这个例子中,我们假设NDK安装在D盘,路径为"D:\android-...

    Windows下Eclipse搭建AndroidNDK开发环境[整理].pdf

    本资源摘要信息将详细介绍Windows下Eclipse搭建AndroidNDK开发环境的过程,从Cygwin的搭建到Eclipse的配置,囊括了整个开发环境的搭建过程。 Cygwin的搭建 Cygwin是一个类Unix操作系统的模拟环境,可以在Windows...

Global site tag (gtag.js) - Google Analytics