Android NDK环境搭建及遇到的问题详解.docx

上传人:b****4 文档编号:12095931 上传时间:2023-04-17 格式:DOCX 页数:27 大小:981.52KB
下载 相关 举报
Android NDK环境搭建及遇到的问题详解.docx_第1页
第1页 / 共27页
Android NDK环境搭建及遇到的问题详解.docx_第2页
第2页 / 共27页
Android NDK环境搭建及遇到的问题详解.docx_第3页
第3页 / 共27页
Android NDK环境搭建及遇到的问题详解.docx_第4页
第4页 / 共27页
Android NDK环境搭建及遇到的问题详解.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

Android NDK环境搭建及遇到的问题详解.docx

《Android NDK环境搭建及遇到的问题详解.docx》由会员分享,可在线阅读,更多相关《Android NDK环境搭建及遇到的问题详解.docx(27页珍藏版)》请在冰豆网上搜索。

Android NDK环境搭建及遇到的问题详解.docx

AndroidNDK环境搭建及遇到的问题详解

AndroidNDK环境搭建及遇到的问题详解

最近在Android的应用开发,尝试了搭建NDK环境,其中步骤很是麻烦,也遇到了一些问题,找了很多网上的教程和资料,最终把遇到的问题解决了。

先,就我遇到的问题进行整合和找到的资料,以备遇到同样问题的朋友参考。

1.下载安装AndroidNDK

我使用的NDK版本为r7,

自己可以到网上下载,

我的下载地址是:

 

 

下载后解压。

 

2.下载安装cygwin

由于NDK编译代码时必须要用到make和gcc,所以你必须先搭建一个linux环境,cygwin是一个在windows平台上运行的unix模拟环境,它对于学习unix/linux操作环境,或者从unix到windows的应用程序移植,非常有用。

通过cygwin,你就可以在不安装linux的情况下使用NDK来编译C、C++代码了。

下面我们一步一步的安装cygwin吧。

首先,你得先跑到下载setup.exe

(1) 然后双击运行吧,运行后你将看到安装向导界面:

(2)点击下一步

   此时让你选择安装方式:

● InstallfromInternet:

直接从Internet上下载并立即安装(安装完成后,下载好的安装文件并不会被删除,而是仍然被保留,以便下次再安装)。

●  DownloadWithoutInstalling:

只是将安装文件下载到本地,但暂时不安装。

●  InstallfromLocalDirectory:

不下载安装文件,直接从本地某个含有安装文件的目录进行安装。

(3)最好选择第一项,然后点击下一步(其他选项我也试过,没有效果)

(4)选择要安装的目录,注意,千万不要放到有中文和空格的目录里(这点要注意),之后点下一步:

(5)一步是选择安装cygwin的目录,这个是选择你下载的安装包所在的目录,默认是你运行setup.exe的目录,直接点下一步就可以:

(6)此时你共有三种连接方式选择(如图):

  

● DirectConnection:

直接连接。

● UseIE5Settings:

使用IE的连接参数设置进行连接。

● UseHTTP/FTPProxy:

使用HTTP或FTP代理服务器进行连接(需要输入服务器地址、端口号)。

     一般正常情况下,均选择第一种,也就是直接连接方式。

然后再点击“下一步”,

(7) 这是选择要下载的站点,我用的是http:

//mirrors.kernel.org,速度感觉还挺快,选择后点下一步

(8) 此时会下载加载安装包列表

(9)Search是可以输入你要下载的包的名称,能够快速筛选出你要下载的包。

那四个单选按钮是选择下边树的样式,默认就行,不用动。

View默认是Category,改成full显示全部包再查,省的一些包被隐藏掉。

左下角那个复选框是是否隐藏过期包,默认打钩,不用管它就行,下边开始下载我们要安装的包,为了避免全部下载,这里列出了后面开发NDK用得着的包:

autoconf2.1、automake1.10、binutils、gcc-core、gcc-g++、gcc4-core、gcc4-g++、gdb、pcre、pcre-devel、gawk、make共12个包(红色字体标注的一定要下载,其他几个最好也下载)

(10) 然后开始选择安装这些包,点skip,把它变成数字版本格式,要确保Bin项变成叉号,而Src项是源码,这个就没必要选了。

以下是下载过程(耐心等待吧少年):

 

 

(11) 下面测试一下cygwin是不是已经安装好了。

    运行cygwin,在弹出的命令行窗口输入:

cygcheck-c命令,会打印出当前cygwin的版本和运行态,出现如下图的结果,则cygwin运行正常。

如图:

 

 

 

    然后依次输入gcc–version,g++--version,make–version,gdb–version进行测试,如果都打印出版本信息和一些描述信息,这样的话,少年,恭喜你,你的cygwin就安装完成了!

(小小高兴一下吧)

3配置NDK环境变量

(1)首先找到cygwin的安装目录,找到一个home\<你的用户名>\.bash_profile文件,我的是:

F:

\NDK\home\samsung\.bash_profile,(注意:

安装的时候我的home文件夹下面可能什么都没有,解决办法:

F:

\NDK\etc\skel\.bash_profile拷贝到该文件夹下)。

(2)打开bash_profile文件,添加NDK=/cygdrive/<你的盘符>/

例如:

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

exportNDK

NDK这个名字可以自己定义(你可以自己定义一个很霸气的名字),然后保存。

(这部分是关键,这是网上很多人遇到的问题,处理过程我自己摸索的,可能还有其他方法,这个方法绝对可行。

方法:

利用UltraEdit(网上下载)打开.bash_profile(为什么要用这个打开这个文件?

因为dos环境和unix环境不同,特别是换行符号上,在dos(windows)环境下换行标志是^P,而在unix环境下是^n),目的是要把dos文件转换为unix文件。

方法一:

改换行符,在UltraEdi软件里“搜索”—>“替换”—>”find”里面输入”^P”替换里输入“^n”。

方法二:

点击文件->转换->DOS到UNIX。

  

然后在里面加入上述的两行就可(注意NDK的目录不能有空格)

(3)打开cygwin,输入cd$NDK,如果输出上面配置的/cygdrive/e/android-ndk-r7信息,则表明环境变量设置成功了。

(好好高兴一下吧)

注:

在这里我也遇到了很纠结的问题,配置NDK环境变量的时候总是失败,总结原因是:

我误解了“cd$NDk”命令,我的错误输入方法如下:

 

正确的输入方法如下:

 

4.用NDK来编译程序

(1)现在我们用安装好的NDK来编译一个简单的程序吧,我们选择ndk自带的例子hello-jni,我的位于E:

\android-ndk-r7\samples\hello-jni(根据你具体的安装位置而定)

(2) 运行cygwin,输入命令cd/cygdrive/e/android-ndk-r7/samples/hello-jni/jni,进入到E:

\android-ndk-r5\samples\hello-jni\jni目录。

  

(3) 输入$NDK/ndk-build(注意:

输入的时候不要忘记了NDK前面的$符号,我就犯了这个很低级的错误),执行成功后,它会自动生成一个libs目录,把编译生成的.so文件放在里面。

($NDK是调用我们之前配置好的环境变量,ndk-build是调用ndk的编译程序)

 

  

备注:

若出现错误

 

 

解决方法:

删除E:

\android-ndk-r7\prebuilt\windows\bin

目录下的awk.exe文件

(4)此时去hello-jni的libs目录下看有没有生成的.so文件,如果有,你的ndk就运行正常啦!

(你可以再次高兴一下啦少年)

  

 

5.在eclipse中集成c/c++开发环境

(1)装Eclipse的C/C++环境插件:

CDT,这里选择在线安装。

(这个插件有点大,网上的地址很多无效,找了半天找到了下面这个地址)

http:

//download.eclipse.org/tools/cdt/releases/galileo

 

(2)然后点Help菜单,找到InstallNewSoftware菜单

 

 

 (3)点击Add按钮,把取的地址填进去,填写自己喜欢的名字,在弹出来插件列表后,选cdt的主特性,然后选择下一步即可完成安装。

(详细步骤,如以下截图所示)

 a)

 

b)单击Add按钮

 c)

 

d)

 e)

点击next

 f)

点击finish

 

 

g)理新完成后,重启eclipse

  

(4)  安装完成后,在eclispe中右击新建一个项目,如果出现了c/c++项目,则表明你的CDT插件安装成功啦!

(这个插件有点大,耐心等待)

6配置C/C++的编译器

(以下适合直接导入ndk的例子,对于自己要编写jni的程序,将在7中做详细介绍。

以下的这部分的功能是实现eclipse的自动编译,这才是我们的关键目的,此时,可以不要用到cygwin“显示”的对程序进行编译出.so文件,这部分设置操作正确的话,就实现了对程序的自动编译。

以后,就可以和我们运行android应用程序一样直接RunAs啦!

(1)打开eclipse,导入ndk自带的hello-jni例子(同导入已存在android的工程一样),右键单击项目名称,点击Properties,弹出配置界面,之后再点击Builders,弹出项目的编译工具列表,之后点击New,新添加一个编译器,点击后出现添加界面,选择Program,点 击OK。

 

(2)出现了添加界面,首先给编译配置起个名字,如:

C_Builder

  设置Location为<你cygwin安装路径>\bin\bash.exe程序,例如:

F:

\NDK\bin\bash.exe,设置WorkingDirectory为<你cygwin安装路径>\bin目录,例如:

F:

\NDK\bin

(上述的两句话什么作用呢?

添加了上述两句话,功能相当于隐式启动了cgywin)

 

  设置Arguments为:

  --login-c"cd/cygdrive/e/androidNDK/ndkr7/samples/hello-jni&&$NDK/ndk-build"

Arguments这串参数实际是 给bash.exe命令行程序传参数,进入要编译的程序目录,然后运行ndk-build编译程序

 

“cd/cygdrive/e/androidNDK/ndkr7/samples/hello-jni”这段话相当于在cgywin里输入

“cd/cygdrive/e/androidNDK/ndkr7/samples/hello-jni”,这样就进入了要编译的程序的目录,而”$NDK/ndk-build”这段则开始编译.

注意:

第一段话依据自己存放路径来定。

以下是我的截图

  

(3)接着切换到Refresh选项卡,给Refreshresourcesuponcompletion打上钩,如图所示:

 点击右边的:

  

进入如图界面:

 这会儿要勾上libs这个文件夹,这个文件夹要自己新建,用来存放编译生成的.so等文件。

不能命名为其他的名字,这个是系统默认识别的文件夹

(4)然后切换到BuildOptions选项卡,按照如图勾上:

 (

5)之后类似上一步点击右边的SpecifyResources按钮,进入如下设置界面:

 勾上

jni这个文件夹。

(6)最后点击Finish,点击OK一路把刚才的配置都保存下来,注意:

如果你配置的编译器在其它编译器下边,记得一定要点Up按钮,把它排到第一位,否则C代码的编译晚于Java代码的编译,会造成你的C代码要编译两次才能看到最新的修改

  

(7)这一路下来肯定很累了吧,现在再次恭喜你,编译配置也配置完成啦,现在来测试一下是否可以自动编译呢,打开项目jni目录里的hello-jni.c文件把提示HellofromJNI!

改成其他的文字:

如:

Hello,huangming,然后再模拟器中运行你的程序,如果模拟器中显示了你最新修改的文字,你已经全部配置成功啦!

 

以下是我的修改过程和结果:

 在模拟器上的运行结果:

 还有一些要注意的地方,设置类似

C_Builder这样的编译器是,每次都要设置一次,因为路径不一样,所以,还是有点小小的不够自动,不过,比起在cygwin里一行一行的敲代码生成.so方便多了。

7.编写一个简单的JNI例子

下面用一个简单的例子介绍怎么生成一个.so文件以及在Android项目中怎么调用.so文件

(1)首先,用Eclipse建立一个ANDROID的工程,命名为MyFirstJNI,Activity名称为JniTest,包名为.lhp,工程代码为:

 

package.lhq;

importandroid.app.Activity;

importandroid.os.Bundle;

importandroid.widget.TextView;

publicclassJniTestextendsActivity{

/**Calledwhentheactivityisfirstcreated.*/

@Override

publicvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

//setContentView(R.layout.main);

TextViewtv=newTextView(this);

tv.setText(stringFromJNI());

setContentView(tv);

}

publicnativeStringstringFromJNI();

static{

System.loadLibrary("MyFirstJNI");

}

}

(2)制作生成.so文件:

可以通过获取以.h文件来获取函数申明。

打开命令行,键入cd (这个路径是使用Eclipse建立的工程目录的src的路径,我的是F:

\workspace\MyFirstJNI\src),目的是设置工程目录。

然后键入:

javah -jni .lhq.JniTest,结果如果失败,那就是因为没有把MyFirst.class文件拷贝到F:

\workspace\MyFirstJNI\src\com\cn\lhq之下,原因是Eclipse的文件管理机制会将.class文件和.java文件分开到不同的目录。

解决方法是将F:

\workspace\MyFirstJNI\bin\com\cn\lhq的所有.class文件都拷贝到src\com\cn\lhq目录下面。

再次运行javah -jni .lhq.JniTest即可。

备注:

在这一步骤时,在执行javah -jni .lhq.JniTest时,出现错误javah不是内部或外部命令。

我找到的解决方案是:

打开环境变量配置界面:

我们电脑-属性-高级-环境变量。

先说说为什么要配置环境变量

jdk中的工具都是以命令行方式使用的,如java,javac,javadoc,javah等

当我们在cmd中输入javacTest.java进行编译时,系统并不知道javac这个命令在什么地方,所以系统会报错“'javac'不是内部或外部命令,也不是可运行的程序或批处理文件。

事实上,我们在cmd中输入命令时,系统会首先在当前目录下寻找该命令,如果没有,系统就会按照环境变量Path中列出的路径进行寻找,找到就执行,找不到就报错

这样,如果要想在任何一个目录下都能使用jdk中的命令,就必须配置Path路径,配置如下:

在系统变量区新建,名称JAVA_HOME,值C:

\ProgramFiles\Java\jdk1.6.0_10(jdk的安装路径,视情况修改即可)

找到Path,编辑,在最前端插入%JAVA_HOME%\bin;

现在所有的命令都可以使用了

【注】JAVA_HOME可以不建,%JAVA_HOME%要完整替换为C:

\ProgramFiles\Java\jdk1.6.0_10

这个问题解决后,接着上面讲解。

 

然后就可以看到在F:

\workspace\MyFirstJNI\src下多出了一个文件:

com_cn_lhq_JniTest.h,通过这个文件,我们就知道了本地接口的函数名,于是我们就根据函数名写一个com_cn_lhq_JniTest.c文件, 代码如下:

#include

#include

jstring

Java_com_cn_lhq_JniTest_stringFromJNI(JNIEnv*env,

jobjectthiz)

{

return(*env)->NewStringUTF(env,"HellofromJNI!

");

}

 

注意:

这个函数的参数与用javah生成出来的参数是不同的,这里只是需要函数名而已,因为函数名必须匹配,否则在模拟器上面跑的时候会出错,当然,如果对JNI命名规则熟悉的话可以跳过javah这步,直接写一个.c文件。

写好.c文件之后就开始生成.so文件了,这时候需要用到ANDROID.MK这个文件。

于是把Eclipse生成的工程目录剪切,放到NDK目录的samples目录之下 (和示例hello-gl2一样),这个时候模仿hello-gl2文件层次结构,将MyFirstJNI文件也做成那样:

在MyFirstJNI文件夹下面新建一个jni文件夹,把com_cn_lhq_JniTest.c剪切到此文件夹中,同时也拷贝一个ANDROID.MK文件到此文件夹,用UltraEdit打开ANDROID.MK文件进行修改,主要修改如下:

LOCAL_MODULE    :

= 工程名

LOCAL_SRC_FILES :

= .c的文件名(包含扩展名)

此例子应改为:

LOCAL_MODULE    :

= MyFirstJNI

LOCAL_SRC_FILES :

= com_cn_lhq_JniTest.c

然后打开cygwin,进入E:

\Android_NDK\android-ndk-r7\samples\MyFirstJNI\jni目录:

   

 

再输入$NDK/ndk-build命令,在E:

\Android_NDK\android-ndk-r5\samples\MyFirstJNI生成libs文件夹,即生成.so文件:

  

(3)在eclipse中重新导入生成了.so文件的MyFirstJNI项目,运行效果图如下:

  

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 商务科技

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1