去年搞过一次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 上测试通过
如有转载请注明出处 谢谢
版权声明:本文为博主原创文章,未经博主允许不得转载。