windows安卓NDK编程

来源:互联网 发布:怎么做淘宝店铺模板 编辑:程序博客网 时间:2024/05/29 19:07

去年搞过一次NDK,当时觉得挺麻烦,以后就一直没再搞过,现在公司的项目需要使用NDK编程,今天又搞了一边,遇到了些问题,和大家分享一下

.

 

一. 安装Cygwin

 

1.下载Cygwin http://cygwin.com/setup-x86.exe   双击运行出现如下界面,点击下一步

 

选择install from internet ,点击下一步

 

 

选择默认位置 c:\cygwin ,点击下一步

 

依旧默认位置,继续点击下一步

 

默认选项Direct Connection 就可以,继续点击下一步

 

可以选择网易163服务器,继续下一步

 

 

出现下面界面

 

 选择需要安装Cygwin组件 : 这里我们只需要以下组件 : binutils , gcc , gcc-mingw , gdb , make , 不用下全部的组件;

 例如输入gcc 后下面会自动列出各组件,点击All右边的单词,直到下面都变成install为止,然后点击下一步就可以等待安装了,安装完后点击上一步就又回到该界面,

另外几个组件安装方式同上。

 

 

安装完后目录是这样的

双击上面目录中的Cygwin.bat ,在启动的窗口中输入make      -version ,若出现类似下面界面,表示安装成功

 

 

 

二.下载ndk

1.- windows版本NDK:android-ndk-r9c-windows-x86.zip (32位),android-ndk-r9c-windows-x86_64.zip (64位) 该版本是用在windows上的Cygwin下, 不能直接在windows上直接运行;

2.下载完后解压并放到C:\\cygwin\中,目录结构如下

 

 

三.创建安卓工程

1.创建安卓工程,并在工程根目录下新建jni文件夹,

 

 

2.运行一下工程,让工程中的bin文件夹中生成class文件,(class文件在工程中的bin中看不到,可以从资源管理器中打开该bin文件夹)

 

3.生成对应的头文件

例    可以通过这种方式生成头文件 javah    -classpath      F:/ndkTest/bin/classes    -d     c:/      -jni     com.example.ndktest.TestJNI

 

F:\ndkTest\bin\classes 是包所在目录 , c:/表示生成的头文件存放位置,com.example.ndktest.TestJNI 是包.类名
        (备注   下面的控制台不是windows的命令窗口,而是 C:\cygwin中的Cygwin.bat   )

 

 

 

把c盘中生成的com_example_ndktest_TestJNI.h复制到安卓工程中的jni文件夹

 

在jni文件夹中新建.cpp文件,如 main.cpp    ,然后使用include命令包含.h文件,并把.h文件中的函数复制到main.cpp中,记得要给复制过来的函数加上参数,同时把末尾的;改成  {      }   ,该例子中使用NewStringUTF创建了一个utf8编码的字符串并返回

 

 

在jni文件夹中编写Android.mk文件      mk文件一定要当心,写错后不会报错,但调用时却会抛异常

获取当前文件内容 : $(call my-dir) 是编译器中的宏方法, 调用该宏方法, 就会返回前的目录路径
赋值符号 : " := " 是赋值符号, 第一句话 是 返回当前文件所在的当前目录, 并将这个目录路径赋值给 LOCAL_PATH;
初始化编译模块参数 : $(CLEAR_VARS) 作用是将编译模块的参数初始化, LOCAL_MODULE LOCAL_SRC_FILES 也是这样的参数;
指定编译模块 : LOCAL_MODULE    := hello , 指定编译后的 so 文件名称, 编译好之后系统会在该名称前面加上 "lib", 后缀加上 ".so";
指定编译源文件 : LOCAL_SRC_FILES := main.cpp 告诉编译系统源文件, 如果有多个文件那么就依次写在后面即可; 
编译成静态库 : include $(BUILD_SHARED_LIBRARY), 作用是高速系统, 编译的结果编译成 .so 后缀的静态库;

静态库引入 : NDK的platform中有很多 ".a" 结尾的动态库, 我们编译动态库的时候, 可以将一些静态库引入进来;

 

 

为了防止手动输入错误,直接把代码放在这,大家可以直接复制后修改一下

 

LOCAL_PATH :=$(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE :=TestJNI

LOCAL_SRC_FILES := main.cpp

include $(BUILD_SHARED_LIBRARY)

 

 

 

 

 

 

在安卓工程根目录下新建Application.mk文件,并输入如下内容  ,注意 APP_MODULES 值要和Android.mk中 LOCAL_MODULE 值一样

同样把代码放在这,方便大家复制

APP_PROJECT_PATH:=$(call my-dir)
APP_MODULES:=TestJNI

 

四.编译

启动c:\\cygwin中Cygwin.bat,输入 cd  你的工程所在绝对位置   我的工程在f盘中,工程名叫ndkTest,所以输入cd     f:/ndkTest,注意下线方向

 

 

输入/android-ndk-r9c/ndk-build   ,我的android-ndk-r9c在C:\cygwin中,所以可以直接这样输  参见 二.下载   2.中目录结构

输入完后回车,会出现如下提示,表示生成so库成功

 

 

 

刷新一下安卓工程,在libs中armeabi中看到生成的lib开头,.so结尾的库  (右击安卓工程名,选择refresh即可刷新工程)

在调用声明的native函数前要先调用System.loadLibrary() ,调用一次即可,参数是类库的名字,注意,不包括开头的lib和结尾的.so

 

 

安卓ndk编程到此就完结了。

 

五.注意事项  

   有的安卓工程中还有armeabi-v7a文件夹,记得把生成的so库也要拷贝到该文件夹中一份。

   mk文件输入错误后不会报错,直到调用时才会抛出异常,一定要小心

 

备注:以上在windows7   旗舰版 32位 sp1 ,i3处理器上编译通过,在 安卓arm模拟器上测试通过,小米note 上测试通过

 

如有转载请注明出处  谢谢 

0 0
原创粉丝点击