去年搞过一次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文件一定要当心,写错后不会报错,但调用时却会抛异常
为了防止手动输入错误,直接把代码放在这,大家可以直接复制后修改一下
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 上测试通过
如有转载请注明出处 谢谢
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/qingchunweiliang/article/details/47276767