请教一个windows7遇到关键问题下用NDK的问题

博客分类:
由于Android系统是搭建在Linux之上的,所以想调用jni的话必须把c++动态链接库编译为so。
第一步,windows下的linux环境准备,先装一个cygwin。
安装步骤我就不多说了,网上有很多参考例子。这里我给大家介绍个国内比较快的镜像地址:
安装cygwin需要很久,这个镜像地址我是花了半天装完的。值得注意的是中途如果网络出了问题
或者其他原因导致安装中断了。把那个devel-default改为devel-reinstall这样就会续装而不是重
装,可以节省很多时间。总的来说cygwin的安装还是比较容易的,只是要花不少时间而已。
第二步,下载android ndk。
我这里用的是目前最新的版本android-ndk-r5b。从r4以后就跟原来的
不一样了。安装方法也不一样。下载这个需要翻(和谐)墙大家都懂的。下载完以后把压缩文件随便解压到一个
目录。解压就行了不需要像之前的版本还要安装一下。
第三步,配置ndk和cygwin。
假如我的cygwin安装目录是C:\cygwin-install。找到C:\cygwin-install\home\alex.ren下的.bash_profile文件。
打开并添加一行:NDK=/cygdrive/f/android-ndk-r5b。我的android-ndk-r5b安装在f盘下面。(F:\android-ndk-
r5b,注意这个是ndk的根目录)。
第四步,写个jni调用的小例子。
打开eclipse新建一个android的工程。没什么特别的默认填写工程名,activity名字,包名。
我的包名为:com.hello.jni。在这个包下面创建一个JniTest类。
package com.hello.public class JniTest {
public native String get();
System.loadLibrary("jnitest");
第五步,生存Jni头文件。
首先生存jni的头文件。通过命令 javah -jni com.hello.jni.JniTest。在执行这个命令之前要先准备下面这些步骤。
1.由于eclipse默认把java class编译文件放在bin目录下,源文件在src目录下。所以需要把JniTest.class拷到
工程目录/src/com/hello/jni下面。如果JniTest类引用到了其他的class那么把其他所有引用到的class都拷到下面去。
2.最容易忽视掉的一点是上面那个javah命令需要在你的工程目录/src下面执行。不然会报找不到文件的错误。
第六步,准备Jni源文件
其实上面那个jni头文件要不要都无所谓,我们需要的是生存的那个JniTest类里面get方法在jni下面的格式。
在你的android工程目录下面建立一个jni目录。添加如下两个文件:
Android.mk
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE
:= jnitestLOCAL_SRC_FILES := jnitest.cinclude $(BUILD_SHARED_LIBRARY)
jnitest就是生成的so模块名,jnitest.c就是c源文件。
#include &string.h&#include &jni.h&/* This is a trivial JNI example where we use a native method * to return a new VM String. See the corresponding Java source * file located at: * */jstringJava_com_hello_jni_JniTest_get( JNIEnv* env, jobject thiz ){
return (*env)-&NewStringUTF(env, "Hello from my JNI test!");}
Java_com_hello_jni_JniTest_get,注意下这个函数的命名格式,我是直接从头文件里面copy过来的。别搞错了不然
没法调用的。(这个c文件写好后我把头文件删除掉了反正也没用到)
第七步,生成so库
在你的工程目录/jni下执行命令:$NDK/ndk-build。这个命令执行成功后会在你的工程目录下生成libs/armeabi/libjnitest.so文件。这个就是要在android下调用的jni库。
第八步,在android里面调用这个jni库函数
package com.hello.import android.app.Aimport android.os.Bimport android.widget.TextVpublic class HelloJni extends Activity { private JniT
/** Called when the activity is first created. */
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
jni = new JniTest();
/* Create a TextView and set its content.
* the text is retrieved by calling a native
* function.
tv = new TextView(this);
tv.setText( jni.get() );
setContentView(tv);
顶楼主 看了好多就楼主的给力
浏览: 147134 次
来自: 深圳
顶你个肺,你写的太简单了
/questi ...
这个不能说明内存映射比较快吧, 只能说明 nio 比 io 快 ...
www_JE 写道顶楼主 看了好多就楼主的给力 那可不是
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'& Windows系统下配置Android NDK开发环境
Windows系统下配置Android NDK开发环境
&&&&& 通常Android系统中的应用都是用Java语言开发的,而Android NDK能让我们在中使用C/C++原生代码。使用NDK的好处包括合理复用现有的代码、提高程序中某些关键部分的执行效率。&&&&&& 本文就来讲讲怎样在Windows系统下配置NDK开发环境。这里假设大家已经安装好了Android的开发环境,包括、以及。&&&&&& 步骤一:下载并安装NDK&&&&&& 首先,前往从网站 获取Windows 平台的最新的Android NDK 套件,下载完成会得到一个安装文件。将下载的压缩包解压到 C:\ 盘的根目录下,得到文件夹android-ndk-r5b,NDK是不需要安装的,直接可以使用了。&&&&&& 步骤二:下载并安装cygwin&&&&&& 我们可以到Cygwin的官方网站下载Cygwin的安装程序,地址是:&&&&&& &&&&&& 或者直接使用下载连接来下载安装程序,下载连接是:&&&&&&&&&&&&&& 下载完成后,运行setup.exe程序,出现安装画面。下面是安装步骤:&&&&&& 1. 直接点&下一步&,出现安装模式的对话框。在对话框中我们看到有三种安装模式:&&&&&&&Install from Internet:这种模式直接从Internet安装,适合网速较快的情况; &&&&&& Download Without Installing:这种模式只从网上下载Cygwin的组件包,但不安装;&&&&&&& Install from Local Directory:这种模式与上面第二种模式对应,当你的Cygwin组件包已经下载到本地,则可以使用此模式从本地安装Cygwin。&&&&&&&从上述三种模式中选择适合你的安装模式,这里我们选择第一种安装模式,直接从网上安装,当然在下载的同时,Cygwin组件也保存到了本地,以便以后能够再次安装。选择后点击&下一步&。&&&&&&& 2.& 这一步需要选择Cygwin的安装目录,以及一些参数的设置。默认的安装位置是C:\cygwin\,你也可以选择自己的安装目录。继续点击&下一步&。&&&&&&& 3.& 这一步我们可以选择安装过程中从网上下载的Cygwin组件包的保存位置,选择完以后,点击&下一步&。&&&&&&& 4.& 这一步选择连接的方式,选择你的连接方式,然后点击下一步。&&&&&&& 5.& 这时会出现选择下载站点的对话框,如下图所示:&&&&&&& 在这一步,需要注意,为了获得最快的下载速度,我在列表中选择Cygwin台湾镜像的地址,选择完成后,继续点击&下一步&。&&&&&& 6. 这一步,我们选择需要下载安装的组件包,为了使我们安装的Cygwin能够编译程序,我们需要安装gcc编译器,默认情况下,gcc并不会被安装,我们需要选中它来安装。为了安装gcc,我们用鼠标点开组件列表中的&Devel&分支,在该分支下,有很多组件,如下图:&&&&&& 我们必须的是:&&&&&&&binutils &&&&&& gcc&&&&&&&&gcc-mingw &&&&&& make &&&&&& gdb&&&&&& 鼠标点击组件前面的循环按钮,会出现组建的版本日期,我们选择最新的版本安装,下图是选中后的5类组件的截图:&&&&&& binutils组件:&&&&&&&gcc组件:&&&&&&&gcc-mingw组件:&&&&&& gdb组件:&&&&&& Make组件:&&&&&& 组件选择好以后,继续点击&下一步&。&&&&&& 7. 进入安装过程,安装的时间依据你选择的组件以及网络情况而定。安装完成后,安装程序会提示是否在桌面上创建Cygwin图标等,点击完成退出安装程序。&&&&&& 安装完成后,点击桌面上的图标即可启动Cygwin。&&&&&& 在Shell窗口上输入make &v以及gcc &v试试,如果安装成功,应该能顺利显示make和gcc的版本信息。&&&&&& 步骤三:配置Cygwin&&&&&& 为了方便使用Cygwin下的命令,可装Cygwin下的bin目录添加到系统的PATH路径,用以下方法进行设置:&&&&&& 1)右击&我的电脑&-&属性 ,再选择左边导航的&高级系统设置&选项。&&&&&& 2)点击右下角的&环境变量&选项。&&&&&& 3)在&系统变量&中,找到Path环境变量,双击它,在变量值前面追加以下内容:&C:\cygwin\&,注意后面有一个分号。&&&&&& 4)点击&确定&完成环境变量设置。&&&&&& 接着,我们将NDK的环境变量添加到Cygwin.bat中,方法是右击桌面上的Cywin图标,选择编辑即可:&&&&&& 在bash &login &i之前增加如下内容:&&&&&& set NDK=/cygdrive/c/android-ndk-r5b&&&&&& 步骤四:编译NDK示例程序(测试NDK开发环境)&&&&&& 启动Cygwin,在命令行中输入以下命令编译hello-jni示例:&&&&&& # cd /cygdrive/c/android-ndk-r5b/samples/hello-jni&&&&&& # $NDK/ndk-build clean&&&&&& # $NDK/ndk-build&&&&&& 上面的命令将清除hello-jni示例项目,并重新编译,编译后将产出 libhello-jni.so 表示编译成功。&&&&&& 至此,Windows系统下的NDK开发环境成功完成安装。
本文发布:
本文地址:
发布:鸡啄米
&&( 21:44:45)
完全随机文章& 登录/注册
您可以从小木虫客户端获取VIP通行码,无需登录继续浏览
STEP1扫描左侧二维码,下载新版客户端
(已安装客户端用户请无视)
STEP2登录页面下方获取VIP通行码
VIP通行码:
小木虫,学术科研互动社区,为中国学术科研免费提供动力
违规贴举报删除请联系客服电话: 邮箱:(全天候) 或者 QQ:
广告投放与宣传请联系 李想 QQ:
QQ:&&邮箱:
Copyright & 2001-, All Rights Reserved. 小木虫 版权所有
浏览器进程
打开微信扫一扫
随时随地聊科研博客分类:
windows系统上安装与使用Android NDK r5
很早就听说了android的NDK应用,只是一直没有时间去研究,今天花了点时间在windows平台搭建了NDK环境,并成功运行了第一个简单的android应用。
一:什么是NDK?
NDK 提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so 和
java 应用一起打包成apk。这些工具对开发者的帮助是巨大的。下载地址:
NDK 集成了交叉编译器,并提供了相应的mk 文件隔离CPU、平台、ABI 等差异,开发人员只需要简单修改mk 文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。NDK 可以自动地将so 和Java 应用一起打包,极大地减轻了开发人员的打包工作。比较简单的说,NDK是一套交叉编译工具,它可以帮你把你用C或C++书写的代码,编译为.so(类似与win下的.dll)格式的文件,使你可以在你的Android程序当中用Java语言(JNI)调用这些代码.
二:下载安装cygwin
由于NDK编译代码时必须要用到make和gcc,所以你必须先搭建一个linux环境, cygwin是一个在windows平台上运行的unix模拟环境,它对于学习unix/linux操作环境,或者从unix到windows的应用程序移植,非常有用。通过它,你就可以在不安装linux的情况下使用NDK来编译C、C++代码了。下面我们一步一步的安装cygwin吧。
(安装的时候忘记截图了)
首先,你得先跑到下载setup.exe
1、 然后双击运行吧,运行后你将看到安装向导界面:
点击下一步
此时让你选择安装方式:
1)Install from Internet:直接从Internet上下载并立即安装(安装完成后,下载好的安装文件并不会被
删除,而是仍然被保留,以便下次再安装)。
2)Download Without Installing:只是将安装文件下载到本地,但暂时不安装。
3)Install from Local Directory:不下载安装文件,直接从本地某个含有安装文件的目录进行安装。
3、选择第一项,然后点击下一步:
4、选择要安装的目录,注意,最好不要放到有中文和空格的目录里,似乎会造成安装出问题,其它选项不用变,
之后点下一步:
5、上一步是选择安装cygwin的目录,这个是选择你下载的安装包所在的目录,默认是你运行setup.exe的目
录,直接点下一步就可以:
6、此时你共有三种连接方式选择:
Connection:直接连接。
2) Use IE5
Settings:使用IE的连接参数设置进行连接。
3) Use HTTP/FTP Proxy:使用HTTP或FTP代理服务器进行连接(需要输入服务器地址、端口号)。
用户可根据自己的网络连接的实情情况进行选择,一般正常情况下,均选择第一种,也就是直接连接方式。然后
再点击“下一步”,
7、 这是选择要下载的站点,我用的是,速度感觉还挺快,选择后点下一步
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个包
然后开始选择安装这些包吧,点skip,把它变成数字版本格式,要确保Bin项变成叉号,而Src项是源码,这个
就没必要选了。
下面测试一下cygwin是不是已经安装好了。
运行cygwin,在弹出的命令行窗口输入:cygcheck
-c cygwin命令,会打印出当前cygwin的版本和运行状
态,如果status是ok的话,则cygwin运行正常。
然后依次输入gcc –version,g++ --version,make –version,gdb –version进行测试,如果都打印
出版本信息和一些描述信息,非常高兴的告诉你,你的cygwin安装完成了!
三:配置NDK环境变量
首先找到cygwin的安装目录,找到一个home\&你的用户名&\.bash_profile文件,我的
是:E:\cygwin\home\Administrator\.bash_profile,(注意:我安装的时候我的home文件夹下面神马都没有,解决 的办法:首先打开环境变量,把里面的用户变量中的HOME变量删掉,在E:\cygwin\home文件夹下建立名为Administrator的文件夹(是用户名),然后把E:\cygwin\etc\skel\.bash_profile拷贝到该文件夹下)。
打开bash_profile文件,添加NDK=/cygdrive/&你的盘符&/&android ndk 目录& 例
如:NDK=/cygdrive/e/android-ndk-r5
export NDK
NDK这个名字是随便取的,为了方面以后使用方便,选个简短的名字,然后保存
如果你是使用写字板或者记事本修改的,那么启动cygwin时会出错的,在cygwin输入以下命令就可以解决:
dos2unix .bash_profile
3、打开cygwin,输入cd $NDK,如果输出上面配置的/cygdrive/e/android-ndk-r5信息,则表明环境变量设置成功了。
四:用NDK来编译程序
现在我们用安装好的NDK来编译一个简单的程序吧,我们选择ndk自带的例子hello-jni,我的位于E:\android-ndk-r5\samples\hello-jni(根据你具体的安装位置而定),
2、 运行cygwin,输入命令cd /cygdrive/e/android-ndk-r5/samples/hello-jni,进入到E:\android-ndk-r5\samples\hello-jni目录。
3、 输入$NDK/ndk-build,执行成功后,它会自动生成一个libs目录,把编译生成的.so文件放在里面。($NDK是调用我们之前配置好的环境变量,ndk-build是调用ndk的编译程序)
此时去hello-jni的libs目录下看有没有生成的.so文件,如果有,你的ndk就运行正常啦!
五:在eclipse中集成c/c++开发环境
1、 装Eclipse的C/C++环境插件:CDT,这里选择在线安装。
首先登录http://www.eclipse.org/cdt/downloads.php,找到对应你Eclipse版本的CDT插件的在线安装地址。
然后点Help菜单,找到Install
New Software菜单
点击Add按钮,把取的地址填进去,出来插件列表后,选Select All,然后选择下一步即可完成安装
安装完成后,在eclispe中右击新建一个项目,如果出现了c/c++项目,则表明你的CDT插件安装成功啦!
六:配置C/C++的编译器
打开eclipse,导入ndk自带的hello-jni例子,右键单击项目名称,点击Properties,弹出配置界面,之后再点
击Builders,弹出项目的编译工具列表,之后点击New,新添加一个编译器,点击后出现添加界面,选择Program,点
出现了添加界面,首先给编译配置起个名字,如:C_Builder
设置Location为&你cygwin安装路径&\bin\bash.exe程序,例如:E:\cygwin\bin\bash.exe,设置Working
Directory为&你cygwin安装路径&\bin目录,例如:E:\cygwin\bin
设置Arguments为
--login -c "cd /cygdrive/e/android-ndk-r5/samples/hello-jni
&& $NDK/ndk-build"
上面的配置中/cygdrive/e/android-ndk-r5/samples/hello-jni是你当前要编译的程序的目录,$NDK是之前配置
的ndk的环境变量,这两个根据你具体的安装目录进行配置,其他的不用变,Arguments这串参数实际是
给bash.exe命令行程序传参数,进入要编译的程序目录,然后运行ndk-build编译程序
3、 接着切换到Refresh选项卡,给Refresh resources upon completion打上钩
然后切换到Build Options选项卡,勾选上最后三项
之后点击Specify Resources按钮,选择资源目录,勾选你的项目目录即可
最后点击Finish,点击OK一路把刚才的配置都保存下来,注意:如果你配置的编译器在其它编译器下边,记得一定要
点Up按钮,把它排到第一位,否则C代码的编译晚于Java代码的编译,会造成你的C代码要编译两次才能看到最新的修改
这一路下来肯定很累了吧,现在再次恭喜你,编译配置也配置完成啦,现在来测试一下是否可以自动编译呢,打开项
目jni目录里的hello-jni.c文件把提示Hello from JNI!改成其他的文字:如:Hello,My name is alex.,然后再模
拟器中运行你的程序,如果模拟器中显示了你最新修改的文字,那么Congratulations!你已经全部配置成功啦!
ps:如果编译的时候出现:/usr/bin/bash: /ndk-build: No such file or directory,则直接把
--login -c "cd /cygdrive/e/android-ndk-r5/samples/hello-jni && $NDK/ndk-build"中$NDK替换成/cygdrive/e/android-ndk-r5(你ndk安装的目录)
以上过程是我配置NDK的全过程,并在我的机器上运行成功了,参照了上一些不错的资料,现在写出来做个总结,加深一下自己的理解和记忆,谢谢这些无私的奉献者们。
浏览 10494
能生成了so文件,然后我每次去修改了c文件,然后用cygwin编译,重新得到so文件,再拷贝到项目中去?
一般都是把android项目建在NDK目录下,so文件自动生成在项目的libs/eabi目录下。
zhoujianghai
浏览: 305845 次
来自: 深圳
Iterator.remove()这个方法也会出错的。
List&String& save = new A ...
灰常感谢 刚好碰到这个问题, 搜了好多都没找到解决方法
牛哥,怎么找到的,解决了我的报错问题,谢谢
确实好很多了,谢谢博主。
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'Windows下编译使用Android NDK,调用SO文件
我的图书馆
Windows下编译使用Android NDK,调用SO文件
一、首先下载android-ndk,官方网站是:
目前最新的版本是,下载地址:
下载后把压缩包解压出来,例如:D:\ndk,目录下的ndk-build.cmd就是用来编译的批处理命令。
这里以D:\ndk\samples\hello-jni为例,打开D:\ndk\samples\hello-jni\jni\hello-jni.c查看代码:
* Copyright (C) 2009 The Android Open Source Project
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
#include &string.h&
#include &jni.h&
/* This is a trivial JNI example where we use a native method
* to return a new VM String. See the corresponding Java source
* file located at:
apps/samples/hello-jni/project/src/com/example/hellojni/HelloJni.java
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
jobject thiz )
return (*env)-&NewStringUTF(env, "Hello from JNI !");
因为我们是拿这个c源码文件来使用,如果迁就Java_com_example_hellojni_HelloJni_stringFromJNI
函数名的话,在我们的android工程中java类的声明就要是:com/example/hellojni/HelloJni.java。
反之,如果我们的android工程已经创建好,并且包名是com.example.hellojni,stringFromJNI函数我们写在了MainActivity.java类里,
那么这里的c函数就要修改为:Java_com_example_hellojni_MainActivity_stringFromJNI,否则在寻找函数时会找不到。
二、编译,打开cmd命令行窗口,cd进入目录:
然后执行命令:D:\ndk\ndk-build.cmd(如果设置过环境变量则直接使用ndk-build.cmd)来编译hello-jni,如果没有错误会输出:
Gdbserver&&&&& : [arm-linux-androideabi-4.6] libs/armeabi/gdbserver
Gdbsetup&&&&&& : libs/armeabi/gdb.setup
"Compile thumb : hello-jni &= hello-jni.c
SharedLibrary& : libhello-jni.so
Install&&&&&&& : libhello-jni.so =& libs/armeabi/libhello-jni.so
编译成功会在D:\ndk\samples\hello-jni\libs\armeabi目录下生成libhello-jni.so文件。
三、创建android应用程序并使用so文件
打开eclipse创建一个android应用程序HelloJni,默认的com.example.hellojni包下面有一个MainActivity.java,
在此包下添加一个HelloJni.java,
package com.example.
public class HelloJni {
public native String
stringFromJNI();
/* This is another native method declaration that is *not*
* implemented by 'hello-jni'. This is simply to show that
* you can declare as many native methods in your Java code
* as you want, their implementation is searched in the
* currently loaded native libraries only the first time
* you call them.
* Trying to call this function will result in a
* java.lang.UnsatisfiedLinkError exception !
MainActivity.java修改为:
package com.example.
import android.os.B
import android.app.A
import android.view.M
import android.widget.TextV
import android.util.L
public class MainActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main);
HelloJni jni = new HelloJni();
tv = new TextView(this);
String str = jni.stringFromJNI();
Log.d("HelloJni", str);
tv.setText(str);
setContentView(tv);
public boolean onCreateOptionsMenu(Menu menu) {
// I this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
System.loadLibrary("hello-jni");
把编译生成的libhello-jni.so文件复制到F:\eclipse_workspace\HelloJni\libs\armeabi目录下(armeabi如果不存在则手动创建之),然后编译运行,效果图如下:
参考资料:
Android Eclipse JNI 调用 .so文件加载问题:
TA的最新馆藏
喜欢该文的人也喜欢

我要回帖

更多关于 windows10安装ps问题 的文章

 

随机推荐