`
mmdev
  • 浏览: 13469649 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

cygwin配合NDK开发Android程序

 
阅读更多

一、NDK

<wbr><span>NDK 提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so 和java 应用一起打包成apk。</span>怎么在eclipse装这两个我就不多说了。大家按照以前装adt和sdk的方法来搞就好了。不过有一点是要注意的:因为cygwin是在window上模拟linux的控制台环境,所以对于访问文件的路径是不能带有空格的,貌似也不能带中文。所以ndk的解压后存放的路径必须不能包括空格或中文,比如这种“D:\Program Files\android-ndk-windows”在cygwin是不能识别成功的。</wbr>

二、安装cygwin

<wbr><wbr><wbr> 大家可以网上搜一下</wbr></wbr></wbr>

三、配置NDK环境变量

<wbr><wbr><wbr><wbr>上述三样安装成功后,就是配置NDK环境变量的问题了。</wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr>1、<wbr>首先找到cygwin的安装目录,找到一个home\&lt;你的用户名&gt;\.bash_profile文件,我的是:E:\cygwin\home\Administrator\.bash_profile。(注意:我安装的时候我的home文件夹下面神马都没有,解决的办法:首先打开环境变量,把里面的用户变量中的HOME变量删掉,在E:\cygwin\home文件夹下建立名为Administrator的文件夹(是用户名),然后把E:\cygwin\etc\skel\.bash_profile拷贝到该文件夹下)。</wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr>2、 <wbr>打开bash_profile文件,(此处必须要使用UltraEdit文件编辑器打开,并且打开后不要转换格式!使用其他编辑工具打开的话编辑后是乱码,不能执行!)添加NDK=/cygdrive/&lt;你的盘符&gt;/&lt;android ndk 目录&gt; 例<wbr><wbr>如:</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

NDK=/cygdrive/e/android-ndk-r5

export NDK

NDK这个名字是随便取的,为了方面以后使用方便,选个简短的名字,然后保存

<wbr><wbr><wbr><wbr><wbr>3、打开cygwin,输入cd $NDK,如果输出上面配置的/cygdrive/e/android-ndk-r5信息(输出的信息为ndk的安装目录),则表明环境变量设置成功了。</wbr></wbr></wbr></wbr></wbr>

四:用NDK来编译程序

1、现在用安装好的NDK来编译一个简单的程序。在NDK的安装目录下新建一个apps目录存放工程。在apps目录下新建一个myjni目录。打开eclipse,新建一个android工程,新建工程时需要取消复选框“Use default location”,并指定预先建立的myjni文件夹作为工程文件夹。

2、在eclipse里编写Jnitest.java文件:

package minQ.android;


import android.app.Activity;

import android.os.Bundle;

import android.widget.TextView;

public class Jnitest extends Activity {

<wbr></wbr>

private TextView tvTextView;

public native String speak();//声明共享库的函数,不需要在java里实现

String string;

static{

System.loadLibrary("myjni");//动态加载共享库

}

public void onCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

string = speak();

tvTextView = (TextView)findViewById(R.id.myTextView01);

tvTextView.setText(string);

}

}

说明:
程序开始运行的时候会加载myjni,<wbr>static区声明的代码会先于onCreate方法执行。如果你的程序中有多个类,而且如果myjni这个类不是你应用程序的入口,那么myjni(完整的名字是libmyjni.so)这个库会在第一次使用myjni这个类的时候加载<span style="line-height:24px; font-family:Verdana,sans-serif,宋体; background-color:rgb(255,255,255)"><span style="color:#6f3198"><span style="font-family:Verdana,sans-serif,宋体; line-height:24px; background-color:rgb(255,255,255)"><span style="color:#6f3198">。</span></span></span></span></wbr>


3、应用此java文件生成.h文件。使用windows cmd控制台进入到工程目录下的bin目录,输入命令:

Eclipse+CDT+cygwin+NDK
其中-classpath表示类的路径bin;

-d jni表示生成的文件存放的路径

minQ.Android.Jnitest表示类的完整路径。

生成的.h头文件将会放在bin\jni目录下

4、在工程目录下建立Application.mk文件:

APP_PROJECT_PATH:=$(call my-dir)

APP_MODULES :=myjni

说明:在进行NDK开发时,在应用程序目录中一定要有Application.mk文件。用来声明Android工程需要调用的非托管模块(如静态库或共享库)第一行变量APP_PROJECT_PATH表示Android工程所在的目录。在生产共享库文件后,apk将自动将共享库文件拷贝到Android工程\libs\armeabi目录中。第二行变量APP_MODULES表示Android工程需要调用的非托管模块。

5、接下来在工程目录下新建jni目录,把bin\jni目录下的.h头文件移动到此目录下,并且在目录下编写minQ_android_Jnitest.c文件和Android.mk文件。

minQ_android_Jnitest.c文件内容:

<wbr></wbr>

#include<stdlib.h>

#include<stdio.h>

#include"minQ_android_Jnitest.h"//include刚才生成的头文件

jstring Java_minQ_android_Jnitest_speak(JNIEnv* env, jobject this){

<wbr>return (*env)-&gt;NewStringUTF(env,"This is the first NDK program!");</wbr>

}

说明:jstring表示Java字符串,Java_minQ_android_Jnitest_speak的构成为Java_<包名称>_<类>_<函数>,其中<函数>的名称和参数要与Jnitest.java文件定义的函数一致。

Android.mk文件内容:

<wbr></wbr>

LOCAL_PATH :=$(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE :=myjni

LOCAL_SRC_FILES :=minQ_android_Jnitest.c

include $(BUILD_SHARED_LIBRARY)

说明:LOCAL_PATH<wbr>:=<wbr>$(call <wbr>my-dir) <wbr></wbr></wbr></wbr></wbr>一个Android.mk <wbr>文件首先必须定义好LOCAL_PATH变量。它用于在开发树中查找源文件。在这个例子中,宏函数’my-dir’,<wbr>由编译系统提供,用于返回当前路径(即包含Android.mk<wbr>file文件的目录)。</wbr></wbr></wbr>


include <wbr>$( <wbr>CLEAR_VARS) <wbr></wbr></wbr></wbr>CLEAR_VARS由编译系统提供,指定让GNU <wbr> MAKEFILE为你清除许多LOCAL_XXX变量(例如LOCAL_MODULE, <wbr>LOCAL_SRC_FILES, <wbr>LOCAL_STATIC_LIBRARIES,<wbr>等等...),除LOCAL_PATH<wbr>。这是必要的,因为所有的编译控制文件都在同一个GNU <wbr>MAKE执行环境中,所有的变量都是全局的。<br><br><strong>LOCAL_MODULE <wbr>:= myjni</wbr></strong>编译的目标对象,LOCAL_MODULE变量必须定义,以标识你在Android.mk文件中描述的每个模块。名称必须是唯一的,而且不包含任何空格。<br><br> 注意:编译系统会自动产生合适的前缀和后缀,换句话说,一个被命名为'myjni'的共享库模块,将会生成'libmyjni.so'文件。 <wbr><br><br> 重要注意事项: <wbr><br><br> 如果你把库命名为‘libmyjni’,编译系统将不会添加任何的lib前缀,也会生成 <wbr>'libmyjni.so',这是为了支持来源于Android平台的源代码的Android.mk文件,如果你确实需要这么做的话。<br><br><strong>LOCAL_SRC_FILES <wbr>:= <wbr>myjni.c <wbr></wbr></wbr></wbr></strong>LOCAL_SRC_FILES变量必须包含将要编译打包进模块中的C或C++源代码文件。注意,你不用在这里列出头文件和包含文件,因为编译系统将会自动为你找出依赖型的文件;仅仅列出直接传递给编译器的源代码文件就好。<wbr><br><br> 注意,默认的C++源码文件的扩展名是’.cpp’. <wbr>指定一个不同的扩展名也是可能的,只要定义LOCAL_DEFAULT_CPP_EXTENSION变量,不要忘记开始的小圆点(也就是’.cxx’,而不是’cxx’)<br><br><strong>include <wbr>$(BUILD_SHARED_LIBRARY) <wbr></wbr></wbr></strong>BUILD_SHARED_LIBRARY表示编译生成共享库,是编译系统提供的变量,指向一个GNU<wbr>Makefile脚本,负责收集自从上次调用'include<wbr>$(CLEAR_VARS)'以来,定义在LOCAL_XXX变量中的所有信息,并且决定编译什么,如何正确地去做。还有<wbr>BUILD_STATIC_LIBRARY变量表示生成静态库:lib$(LOCAL_MODULE).a,<wbr>BUILD_EXECUTABLE <wbr>表示生成可执行文件。</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><p style="margin:0px 0px 15px; padding:0px">完成到这里,jni目录下就有三个文件:</p> <p style="margin:0px 0px 15px; padding:0px"><a href="http://photo.blog.sina.com.cn/showpic.html#blogid=7aa2703601010jrx&amp;url=http://s5.sinaimg.cn/orignal/7aa270364ba3c54121904" target="_blank"><img title="Eclipse+CDT+cygwin+NDK" name="image_operate_18201330668350734" alt="Eclipse+CDT+cygwin+NDK" src="http://s5.sinaimg.cn/middle/7aa270364ba3c54121904&amp;690"></a></p> <p style="margin:0px 0px 15px; padding:0px">6、此时我们可以启动cygwin编译我们的工程。myjni是apps目录下的应用程序目录名称。在指定应用程序(目录)名称后,NKD编译系统会首先找到目录中的Application.mk文件,根据Application.mk文件的信息,确定该Android共享需要使用的<span style="font-family:Verdana,sans-serif,宋体; line-height:24px; background-color:rgb(255,255,255)">APP_MODULES</span>模块;然后在jni目录中搜索所有Android.mk文件,在找到与<span style="font-family:Verdana,sans-serif,宋体; line-height:24px; background-color:rgb(255,255,255)">APP_MODULES</span>模块匹配的Android.mk文件后,根据Android.mk文件提供的信息编译指定的C/C++源代码文件,形成共享库文件;最后将生产的共享库文件拷贝到Android工程的指定目录中。</p> <p style="margin:0px 0px 15px; padding:0px"><a href="http://photo.blog.sina.com.cn/showpic.html#blogid=7aa2703601010jrx&amp;url=http://s13.sinaimg.cn/orignal/7aa270364ba3c5e829eec" target="_blank"><img title="Eclipse+CDT+cygwin+NDK" name="image_operate_92721330668770571" alt="Eclipse+CDT+cygwin+NDK" src="http://s13.sinaimg.cn/middle/7aa270364ba3c5e829eec&amp;690" width="507" height="144"></a></p> <p style="margin:0px 0px 15px; padding:0px"><span style="color:#6f3198">说明:启动cygwin后,直接输入命令cd $NDK可以进入ndk安装目录,然后进入myjni工程目录,输入命令$NDK/ndk-build (以上说用的$NDK对应于你在安装cygwin时操作bash_profile文件在后面添加的名称一样,见三.2步)。</span></p> <p style="margin:0px 0px 15px; padding:0px">7、打开工程myjni目录,会发现在该目录下自动生成两个文件:libs和obj。生成的.so文件在libs\armeabi目录下。在eclipse下刷新工程,重新编译生成apk,libhello-jni.so共享库会一起打包在apk文件内。然后可以顺利地运行你的第一个NDK程序了!</p> </wbr>
分享到:
评论

相关推荐

    搭建NDK的Android开发环境文档

    NDK允许开发者使用C/C++来开发Android应用的部分或全部功能,提高性能,特别是对于图形处理、游戏引擎和底层库的开发非常有用。在实际开发中,可以通过Eclipse的NDK插件配合Android SDK进行C/C++代码的编译和调试,...

    android NDK开发

    6. **系统和软件要求**:使用 NDK 需要先安装完整的 Android SDK,同时开发的应用程序可能会受到目标设备硬件和 Android 版本的限制。对于开发者而言,理解 Android 系统映像的相关知识也是很重要的。 NDK 不是所有...

    android NDK

    该博客可能详细介绍了Cygwin和Android NDK的安装过程,包括遇到的问题及解决方法,是学习和实践NDK开发的好参考资料。 通过阅读`ndk安装教程.doc`和`14-Cygwin+Android_NDK的安装.docx.docx`文档,可以深入理解这...

    Android_开发环境搭建

    NDK是用于开发Android原生代码(C/C++)的工具集,它允许开发者编写高性能、低级别的代码。在Windows环境下,通常配合Cygwin来处理NDK。配置NDK时,需要根据NDK版本的不同执行相应的脚本,如R1-R3版本需执行`build/...

    windows 搭建andriod 开发环境

    在Windows操作系统中搭建Android NDK开发环境是为了解决Android应用程序中涉及底层硬件交互、性能优化以及使用C/C++编写高效代码的需求。NDK(Native Development Kit)允许开发者使用原生代码来编写部分应用程序,...

    能用的 cygwin

    6. **成功亲测**:这表明该Cygwin环境不仅安装成功,而且已经过实际测试,能够在Windows XP SP3上配合Android NDK r5b版本正常工作,成功完成JNI库的编译任务,证明了这个配置的可行性。 7. **兼容性**:在选择使用...

    cocos2d-x Andriod

    开发cocos2d-x Android程序需要以下组件: - **cocos2d-x引擎**: 是一个开源的2D游戏框架,支持多种平台,包括Android。 - **NDK**: 提供了在Android上编写原生代码(C/C++)的工具集,可以生成.so动态库文件。 - **...

Global site tag (gtag.js) - Google Analytics