参考了百度经验里面的部分内容,发现里面还有些细节没有写出来,其中遇到不少问题,所以就在这里写出来和大家分享!
参考链接 Android NDK入门开发实例
1、先下载 android-ndk32-r10b-windows-x86 我是32位的机子,将其放在一个没有空格的路径中,因为之后在配置cygwin的时候要求路径不能有空格。
2、在cygwin官网上下载 cygwin 安装 ,这个网上有教程,注意不要少了make (我在网上看到的一篇教程里面就是少了make)
安装完后进行测试 :打开cygwin 输入 make -v gcc -v进行测试,出现下面的内容说明安装成功。
3、配置cygwin
如果没有配置cygwin的话,在生成so文件的时候会出现 $NDK/ndk-build :no such file or directory的错误
在安装目录的home里面找到bash_profile
在里面加入
NDK=/cygdrive/g/androidconfig/android-ndk32-r10b-windows-x86/android-ndk-r10b export NDK
这里要注意两点:1、不能使用换行符
2、路径中不能带有空格,否则在运行cygwin 的时候会提示错误
配置好后 ,运行cygwin 输出 cd $NDK 会进入安装路径,说明配置成功
4、编写android程序
首先新建一个项目,在布局页面添加一个按钮即可,如下图所示,图中有两个控件,一个是textview,另一个是button。
新建一个类,并写一个native方法,我写的方法是,public native int add(int a, int b);
实现传入的2个整形数字相加,这里的native方法不需要实现
打开本次项目的路径,里面有2个类,其中JNITest.java便是有native方法的类,下面需要先把这个java编程成class文件然后再编译成.h头文件
- 在CMD中依次输入以下代码:
cd C:\Users\Administrator\workspace\JNITest\src(切换到项目的src目录下)
javac com\liutaw\jnitest\JNITest.java(编译有native方法的java类)
javah com.liutaw.jnitest.JNITest(从class生成.h头文件)
- 2
在项目的根目录新建一个jni文件夹,并把刚才javah生成的 com_liutaw_jnitest_JNITest.h文件复制到jni目录下
- 3
打开com_liutaw_jnitest_JNITest.h,把定义的方法都改为实现,并把文件名的后缀名改为.c,注意方法的参数要加上,以下是修改前后的对比图。
- 4
在jni文件夹下新建一个Android.mk文件,输入以下内容,注意更改成你自己的库文件名和原文件名称
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hellojni(库文件名)
LOCAL_SRC_FILES := com_liutaw_jnitest_JNITest.c(原文件名称)
include $(BUILD_SHARED_LIBRARY)
2个文件完成之后应该是下面这张图。
这里还需要新建一个Application.mk,原文中没有提到。
新建Application.mk。在里面输入
APP_ABI := all
APP_PLATFORM := android-9这里需要注意的是 假如使用APP_ABI 是x86 那么会出现 is not a valid ELF Object错误。这里为了方便直接使用all
APP_ABI
在默认情况下,NDK会使用‘armeabi‘ ABI 来生成二进制机器码,这是基于ARMv5TE的浮点运算CPU,这可以通过使用此变量来选项不同的ABI(Application Binary Interface).
例如:支持基于armv7 FPU指令集的设备:APP_ABI := armeabi-v7a
支持IA-32指令集:APP_ABI := x86
同时支持三种:APP_ABI := armeabi armeabi-v7a x86
从NDK-r7版本后,同时支持三种还可以这样写:APP_ABI := all最后打开cygwin切换到项目目录
最后补上onclick事件 运行OK!
- 4