Android + Eclipse + NDK + cygwin配制,androidndk

  以前做NDK开发时留下来的笔记,希望对后继开发人员有所帮助,在开放给大家使用,有不对的地方请留,扔砖头都可以的。

 为了方便在Win32下开发android C++ 程序,我们作了如下配制:
1、Android 开发环境搭建

下载 JDK
下载 Eclipse
下载 Android SDK
下载 cygwin
下载 android-ndk-r8

先安装好JDK, Eclipse,启动Eclipse , 安装 ADT

安装android 开发插件
(1)打开Eclipse, 在菜单栏上选择 help->Install New SoftWare
出现如下界面:

图片 1

图片 2

图片 3图片 4

图片 5

图片 6图片 7

2、下载安装Android NDK
我使用的NDK版本为android-ndk-r8
Google 出的最新NDK 为 android-ndk-r8 下载地址为

3、下载安装cygwin
由于NDK编译代码时必须要用到make和gcc,所以你必须先搭建一个linux环境,
cygwin是一个在windows平台上运行的unix模拟环境,它对
于学习unix/linux操作环境,或者从unix到windows的应用程序
移植,非常有用。通过它,你就可以在不安装linux的情况下使用NDK来编
译C、C++代码了。下面我们一步一步的安装cygwin吧。
(安装的时候忘记截图了)
首先,你得先跑到
1、 然后双击运行吧,运行后你将看到安装向导界面:
2、 点击下一步
此时让你选择安装方式:
1)Install from
Internet:直接从Internet上下载并立即安装(安装完成后,下载好的安装文件并不会被删除,而是仍然被保留,以便下次再安装)。
2)Download Without
Installing:只是将安装文件下载到本地,但暂时不安装。
3)Install from Local
Directory:不下载安装文件,直接从本地某个含有安装文件的目录进行安装。
3、选择第一项,然后点击下一步:
4、选择要安装的目录,注意,最好不要放到有中文和空格的目录里,似乎会造成安装出问题,其它选项不用变,之后点下一步:
5、上一步是选择安装cygwin的目录,这个是选择你下载的安装包所在的目录,默认是你运行setup.exe的目录,直接点下一步就可以:
6、此时你共有三种连接方式选择:默认第一个就OK;
1) Direct Connection:直接连接。
2) Use IE5 Settings:使用IE的连接参数设置进行连接。
3) Use HTTP/FTP
Proxy:使用HTTP或FTP代理服务器进行连接(需要输入服务器地址、端口号)。用户可根据自己的网络连接的实情情况
进行选择,一般正常情况下,均选择第一种,也就是直接连接方式。然后
7、 这是选择要下载的站点,默认第一个就OK;
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的版本和运行状态,如果status是ok的话,则cygwin运
行正常。然后依次输入gcc –version,g++ –version,make –version,gdb
–version进行测试,如果都打印出版本信息和一些描述信息,非常
高兴的告诉你,你的cygwin安装完成了!
4、配置NDK环境变量
1、
首先找到cygwin的安装目录,找到一个home\<你的用户名>\.bash_profile文件,假如安装目录是:D:\cygwin,(注意:我安装的时候我的
home文件夹下面神马都没有,解决的办法:首先打开环境变量,把里面的用户变量中的HOME变量删掉,重新运行cygwin,自动在目录下生成相关的文件。
2、
打开bash_profile文件,添加NDK=/cygdrive/<你的盘符>/<android
ndk 目录>
例如:
NDK=/cygdrive/d/DevTools/android-ndk-r8
export NDK
NDK这个名字是随便取的,为了方面以后使用方便,选个简短的名字,然后保存
3、打开cygwin,输入cd $NDK,如果输出上面配置的/cygdrive/d/DevTools
/android-ndk-r8信息,则表明环境变量设置成功了。
5、用NDK来编译程序
1、
现在我们用安装好的NDK来编译一个简单的程序吧,我们选择ndk自带的例子hello-jni,我的位于D:\DevTools\android-ndk-r8\samples\hello-jni
(根据你具体的安装位置而定),
2、 运行cygwin,输入命令cd
/cygdrive/d/DevTools/android-ndk-r8/samples/hello-jni,进入到D:\DevTools\android-ndk-r8\samples\hello-jni目录。
3、
输入$NDK/ndk-build,执行成功后,它会自动生成一个libs目录,把编译生成的.so文件放在里面。($NDK是调用我们之前配置好的环境变量,
ndk-build是调用ndk的编译程序)
4、
此时去hello-jni的libs目录下看有没有生成的.so文件,如果有,你的ndk就运行正常啦!
注:如果执行$NDK/ndk-build出现/ndk-build: No such file or
directory错误的话,请查看cygwin\bin下面是否有make.exe,如果没有的话,
重新点击setup文件,然后【Select
Packages】页面中点击【View】,然后再Search中输入make,找到make的安装包,再点击下一步安装就OK了。
5、新建一个ndk工程,目录指向相对应的目录下(便于命令行操作)。就可以很快的完成jni工程的调用了。
6、用javah来编译程序

  1. 用cmd 跳转到放classes 的jni相关的class ,打开cmde.exe
    ,使用<盘符:>跳转到相关的目录
    2.采用javah 编译相关的class文件生成.h头部文件。采用-d
    指定生成文件放的位置。例如我存放在 e盘工程的jni文件夹下:
    D:\DevTools\android-ndk-r8\samples\hello-jni\bin\classes>javah
    -d D:\DevTools\android-ndk-r8\samples\hello-jni\jni
    com.example.hellojni.HelloJni。

7、在Eclipse项目应用NDK

1)、创建android项目

 

2)、右键选择属性Propeties->builders->[New]->[Program]

在[Location]添加cygwin安装路径” D:\cygwin\bin\bash.exe”,[Working
Directory]输入“D:\cygwin\bin”, 在[Argument]中输入“–login -c “cd
/cygdrive/d/Workspace/Camera/jni && $NDK/ndk-build””

3)、选择[Refresh]项,单击【Specify
Resources】然后选中项目中的文件夹[libs] 

4)、右键选择属性Propeties->builders->[New]->[Program]

5)、添加NDK路径,单击【New】输入“NDK”与“/cygdrive/d/DevToolsandroid-ndk-r8”

选择[Refresh]项,单击【Specify
Resources】然后选中项目中的文件夹[libs]

6)、右键选择属性Propeties->builders->[New]->[Program]

  以前做NDK开发时留下来的笔记,希望对后继开发人员有所帮助,在开放给大家使用,有不对的地方请留,扔砖头都可以的。

前期准备

1.下载NDK开发需要的工具包:https://developer.android.com/ndk/downloads/index.html,我使用的是r9d的开发包

2.配置ndk环境变量(后面要使用ndk-build命令,编译项目)

图片 8

If you worked on android NDK, you must be knowing current eclipse ADT
doesn’t have option for NDK building you have to manually run the build
command in cygwin shell. Now i will show you step by step how to make a
builder for android NDK project which will build your native code to
android library when you build your project or save a c source file
Requirements

cygwin怎配置NDK

我的是放在F盘下面一个文件夹里面的,我是这样定义的,NDK4CYRSTAX=/cygdrive/f/android_opencv_android_ndk4_crystax/android-ndk-r4-crystax
export NDK4CYRSTAX
所以你要这么写
NDK_R7=/cygdrive/c/ndk-android-r7
export NDK_R7
其中c为你的c盘,ndk-android-r7是你的NKD目录,注意斜杠和windows的不一样。
 

 为了方便在Win32下开发android C++ 程序,我们作了如下配制:
1、Android 开发环境搭建

编译ndk目录下的demo项目

首先我们来看下ndk下载下来后自带的demo来运行一次,ndk下载下来后,解压,目录下有个sample目录,在Eclipse中导入hello-jni这个项目

图片 9

打开cmd命令窗口,进入Eclipse工作空间中的hello-jni项目目录下(如果在导入Eclipse的时候,没有勾选复制到工作区空间,就要进入ndk下,反正就是进入hello-jni目录下),然后执行ndk-build命令(这就是前面说的先配置好ndk的环境变量,没配置的话,进入ndk解压目录在路径栏直接cmd然后回车)

图片 10

OK,现在刷新一下Eclipse中的helloJni项目,你就能看到多了一个obj文件夹,下面就是so文件,然后就可以运行了,运行后的截图:

图片 11


image

  1. Eclipse
  2. Android ADT
  3. Android NDK
  4. Cygwin

开发android NDK时,在外部用cygwin生成的so文件,复制到eclipse下lib/armeab使用,不可以打包进APK文件里?

应该是libs吧!编写Anplication.mk文件了?
 

+ Eclipse + NDK + cygwin配制,androidndk
以前做NDK开发时留下来的笔记,希望对后继开发人员有所帮助,在开放给大家使用,有不对的地方请…

下载 JDK
下载 Eclipse
下载 Android SDK
下载 cygwin
下载 android-ndk-r8

新建NDK项目

最近看一个NDK项目,因为源码使用Eclipse IDE写的,想把代码导入Android
Studio使用,毕竟好用很多,使用AS导入后,第一个问题就是编码问题,项目之前竟然使用的是GBK编码。首先就是改变编码问题。我先在设置中将项目编码改为UTF-8,build结果显示一堆错误的乱码,在网上逛了一圈,找到解决方案。

if you don’t know what is these please see this Android
NDK

先安装好JDK, Eclipse,启动Eclipse , 安装 ADT

主要步骤:

编码

  • 将AS右下角的UTF-8换成GBK。
  • 跳出提示选择”reload”,此时注释之类的乱码会显示正确。
  • 右下角再选择UTF-8
  • 跳出提示选择”convert”,此时编码从GBK转为UTF-8。
  • 编译运行,就不会出现乱码错误了。
  • 别的乱码的类也是这种方法

Steps

安装android 开发插件
(1)打开Eclipse, 在菜单栏上选择 help->Install New SoftWare
出现如下界面:

     1.在Java文件中编写JavaNative代码

NDK支持

将项目导入之后,build有提示错误:

Error: Flag android.useDeprecatedNdk is no longer supported and will be removed in the next version of Android Studio.  Please switch to a supported build system.
  Consider using CMake or ndk-build integration. For more information 

我们把gradle.propertiesandroid.useDeprecatedNdk=true去掉。然后直接在AS右键Linked C++ Project.选择cmake或者ndk
build
的方式链接。

  • cmake: 选择CMakeLists.txt文件
  • NDK build: 选择Android.mk文件

或者你也可以在你的module中加入

externalNativeBuild {
    ndkBuild {
      path 'src/main/jni/Android.mk'
    }
  }
  1. Import / open a NDK project ( say import hellojni from NDK samples)
  2. Open the project Properties
  3. Select builders
  4. Press New and select
    Programme图片 12Fill
    in you cygwin bash.exe in location, working directory as project
    folder in workspace fill the argument as ndk-build in my case it is
    “I:\Dev\Droid\SDK\ndk\ndk-build”( note this DOS style path will
    result in an waring when compiling better usage will be cygwin path
    in my case it will be /cygdrive/i/Dev/Droid/SDK/ndk/ndk-build)
  5. Go to refresh Tab tick Refresh source on
    compilation图片 13click
    specify Resource and choose lib folder in you project(Note the lib
    folder maynot exist unless you compile the source atleast once for
    first time you can leave option as to refresh the entire
    workspace图片 14
  6. Go to Environment tab and create a new variable named PATH and value
    to bin folder of cygwin and choose append to native
    environment图片 15
  7. Go to build Options tab and tick after clean, during manual build ,
    during auto build and specify relevant sources and choose jni folder
    in
    project图片 16图片 17
  8. press finish
  9. In build order move ndk builder to the
    top图片 18
  10. All done 图片 19

图片 20

     2.使用javah命令根据native方法生成头文件

无法导入

ndk支持后,现在运行项目,项目可以启动了,可是运行直接崩溃,崩溃日志为:

java.lang.UnsatisfiedLinkError: Couldn't load xxx from loader dalvik.system.PathClassLoader

看样子是无法加载库,在module中加入:

sourceSets {
    main {
      jniLibs.srcDirs = ['libs']
    }
  }

然后在defaultConfig中加入:

ndk {
      moduleName "your ndk module name"
      abiFilters "armeabi", "armeabi-v7a", "x86"
    }

图片 21

     3.新建.c文件实现头文件

找不到方法

 java.lang.UnsatisfiedLinkError: No implementation found for int xxxxx

大概意思是so库加载成功了,但是java调用对应函数时,找不到对应的c++函数.

遇到这种情况,不要怀疑,sdk提供的包一定要把包名完整拷贝到项目。路径要与so函数相对应。

图片 22图片 23

     4.新建Android.mk文件

text relocations

java.lang.UnsatisfiedLinkError...xxx.so has text relocations

把targetSdkVersion降级到22就可以了。

图片 24

     5.加载动态链接库

**一:在Java文件中编写JavaNative代码
**

新建项目,在MainActivity中写上一句native代码

图片 25

二:使用javah命令根据native方法生成头文件

在项目上右键–>新建文件夹名字为jni,打开cmd,进入项目所在目录(我的目录E:\eclipse4.5workspace\NDKProject),执行javah命令,可以先看下javah命令的一些参数:

图片 26

OK,然后我们输入:javah -classpth bin/classes -d jni
com.lhq.ndkproject.MainActivity,我们来解释下这句命令:

使用javah命令,指定你要加载的类的文件目录(-classpath),然后指定头文件文件输出目录(-d
jni,指定到jni目录,因为我们前面新建了jni的文件夹,不新建也行,它会自动创建,在你执行javah命令的目录下),然后加上JavaNative代码所在类的完整类名(包名+类名,所以,上面的classpath的参数注意了,输入到你要生成的头文件的源文件所在的目录,不然会找不到),然后回车

图片 27

但是出错了,说找不到activity,因为我们这个native方法是写在MainActivity里面的,但是MainActivity是继承了Activity的,它找不到Activity这个类(如果native方法是写在一个单独Java文件中,不会出这个错),我们更改下命令在bin/classes目录后加一个分号,然后去把Activity加进来,那怎么加进来呢?,去你的sdk目录下的platforms中随便找一个版本的然后进去,比如我进入的是android-21,然后目录下有个android.jar文件,我们要的就是它,复制下文件路径,在刚才命令classes的分号后面粘贴(如果是单独的Java文件就不需要这样),然后执行命令

图片 28

再进入Eclipse刷新一下,在jni目录下多了一个.h的头文件

图片 29

三:新建.c文件实现头文件

现在我们要实现这个头文件,新建一个.c为后缀的文件,随便叫啥,我取个hello.c

图片 30

hello.c文件现在是空的,我们来实现它,在hello.c中需要新引入c的一些库的头文件:stdio,stdlib,当然还有自己的com_lhq_ndkproject_MainActivity.h头文件

图片 31

然后到.h文件中找到我们开始在MainActivity中写的那个native方法所对应的头文件中的方法,到.h中找到这个方法,然后复制到刚修改过的.c文件中,做好相应修改保存

图片 32

四:新建Android.mk文件

现在已经实现了头文件,接下来我们到ndk中的demo,就是我们前面运行的那个demo中,复制Android.mk这个文件到我们自己项目的jni目录下,并做相应修改:LOCAL_MODULE为编译后的so库名字(这个你想叫什么都行),LOCAL_SRC_FILES为你要编译的这个文件的路径

图片 33

现在我们打开cmd命令窗口,进入当前项目目录下执行ndk-build命令,然后Eclipse中刷新项目,会发现多了一个obj文件夹,里面有我们刚编译的so动态链接库

图片 34

图片 35

五:加载动态链接库

编译好的so文件会在前面加上lib前缀,但是我们在加载的时候不需要写,直接写Android.mk中指定的文件名就行了

图片 36

运行成功!!!

图片 37

配置自动编译

到目前为止,我们的ndk项目就能正常运行了,但是,我们每改一次c代码都要手动的用ndk-build编译,那我们来配置下自动编译:

在项目上右击,然后选择properties,然后在弹出窗口中选择Builders,再点击new

图片 38

然后选择Program点击ok

图片 39

然后点击Browse File System

图片 40

选择ndk目录下的ndk-build.cmd文件

图片 41

图片 42

OK,再配置下Working Direcroty,点击Browse Workspace选择自己的项目

图片 43

OK,然后点击Build Optionsg勾选During auto
builds然后点击OK,到此为止,项目就不用每次都手动ndk-build了

图片 44

****************************************如果转载请注明出处***********************************************

图片 45图片 46

2、下载安装Android NDK
我使用的NDK版本为android-ndk-r8
Google 出的最新NDK 为 android-ndk-r8 下载地址为

3、下载安装cygwin
由于NDK编译代码时必须要用到make和gcc,所以你必须先搭建一个linux环境,
cygwin是一个在windows平台上运行的unix模拟环境,它对
于学习unix/linux操作环境,或者从unix到windows的应用程序
移植,非常有用。通过它,你就可以在不安装linux的情况下使用NDK来编
译C、C++代码了。下面我们一步一步的安装cygwin吧。
(安装的时候忘记截图了)
首先,你得先跑到
1、 然后双击运行吧,运行后你将看到安装向导界面:
2、 点击下一步
此时让你选择安装方式:
1)Install from
Internet:直接从Internet上下载并立即安装(安装完成后,下载好的安装文件并不会被删除,而是仍然被保留,以便下次再安装)。
2)Download Without
Installing:只是将安装文件下载到本地,但暂时不安装。
3)Install from Local
Directory:不下载安装文件,直接从本地某个含有安装文件的目录进行安装。
3、选择第一项,然后点击下一步:
4、选择要安装的目录,注意,最好不要放到有中文和空格的目录里,似乎会造成安装出问题,其它选项不用变,之后点下一步:
5、上一步是选择安装cygwin的目录,这个是选择你下载的安装包所在的目录,默认是你运行setup.exe的目录,直接点下一步就可以:
6、此时你共有三种连接方式选择:默认第一个就OK;
1) Direct Connection:直接连接。
2) Use IE5 Settings:使用IE的连接参数设置进行连接。
3) Use HTTP/FTP
Proxy:使用HTTP或FTP代理服务器进行连接(需要输入服务器地址、端口号)。用户可根据自己的网络连接的实情情况
进行选择,一般正常情况下,均选择第一种,也就是直接连接方式。然后
7、 这是选择要下载的站点,默认第一个就OK;
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的版本和运行状态,如果status是ok的话,则cygwin运
行正常。然后依次输入gcc –version,g++ –version,make –version,gdb
–version进行测试,如果都打印出版本信息和一些描述信息,非常
高兴的告诉你,你的cygwin安装完成了!
4、配置NDK环境变量
1、
首先找到cygwin的安装目录,找到一个home\<你的用户名>\.bash_profile文件,假如安装目录是:D:\cygwin,(注意:我安装的时候我的
home文件夹下面神马都没有,解决的办法:首先打开环境变量,把里面的用户变量中的HOME变量删掉,重新运行cygwin,自动在目录下生成相关的文件。
2、
打开bash_profile文件,添加NDK=/cygdrive/<你的盘符>/<android
ndk 目录>
例如:
NDK=/cygdrive/d/DevTools/android-ndk-r8
export NDK
NDK这个名字是随便取的,为了方面以后使用方便,选个简短的名字,然后保存
3、打开cygwin,输入cd $NDK,如果输出上面配置的/cygdrive/d/DevTools
/android-ndk-r8信息,则表明环境变量设置成功了。
5、用NDK来编译程序
1、
现在我们用安装好的NDK来编译一个简单的程序吧,我们选择ndk自带的例子hello-jni,我的位于D:\DevTools\android-ndk-r8\samples\hello-jni
(根据你具体的安装位置而定),
2、 运行cygwin,输入命令cd
/cygdrive/d/DevTools/android-ndk-r8/samples/hello-jni,进入到D:\DevTools\android-ndk-r8\samples\hello-jni目录。
3、
输入$NDK/ndk-build,执行成功后,它会自动生成一个libs目录,把编译生成的.so文件放在里面。($NDK是调用我们之前配置好的环境变量,
ndk-build是调用ndk的编译程序)
4、
此时去hello-jni的libs目录下看有没有生成的.so文件,如果有,你的ndk就运行正常啦!
注:如果执行$NDK/ndk-build出现/ndk-build: No such file or
directory错误的话,请查看cygwin\bin下面是否有make.exe,如果没有的话,
重新点击setup文件,然后【Select
Packages】页面中点击【View】,然后再Search中输入make,找到make的安装包,再点击下一步安装就OK了。
5、新建一个ndk工程,目录指向相对应的目录下(便于命令行操作)。就可以很快的完成jni工程的调用了。
6、用javah来编译程序

  1. 用cmd 跳转到放classes 的jni相关的class ,打开cmde.exe
    ,使用<盘符:>跳转到相关的目录
    2.采用javah 编译相关的class文件生成.h头部文件。采用-d
    指定生成文件放的位置。例如我存放在 e盘工程的jni文件夹下:
    D:\DevTools\android-ndk-r8\samples\hello-jni\bin\classes>javah
    -d D:\DevTools\android-ndk-r8\samples\hello-jni\jni
    com.example.hellojni.HelloJni。

7、在Eclipse项目应用NDK

1)、创建android项目

 

2)、右键选择属性Propeties->builders->[New]->[Program]

在[Location]添加cygwin安装路径” D:\cygwin\bin\bash.exe”,[Working
Directory]输入“D:\cygwin\bin”, 在[Argument]中输入“–login -c “cd
/cygdrive/d/Workspace/Camera/jni && $NDK/ndk-build””

3)、选择[Refresh]项,单击【Specify
Resources】然后选中项目中的文件夹[libs] 

4)、右键选择属性Propeties->builders->[New]->[Program]

5)、添加NDK路径,单击【New】输入“NDK”与“/cygdrive/d/DevToolsandroid-ndk-r8”

选择[Refresh]项,单击【Specify
Resources】然后选中项目中的文件夹[libs]

6)、右键选择属性Propeties->builders->[New]->[Program]

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图